Нежелательные предметы на участке

У меня возникла проблема при использовании подмножества data.frame в R.

Подмножество создается и отображается правильно, но когда я пытаюсь построить его с помощью qplot(), строки, которые не были выбраны subset(), также отображаются вдоль одной оси.

Фактический файл, который я читаю, — это журнал веб-сервера, но я создал небольшой пример, чтобы проиллюстрировать мою проблему:

Это файл ITEMSSOLD.CSV, в котором я читал:

CUST,DT,ITEM,PRICE
BigJoe,10/13/2010,Pickup Truck,20000
TightWad,10/13/2010,USB Drive,12
Jane,10/13/2010,Smart Car,30000
Scrooge,10/13/2010,Gumdrops,1
GeekyMan,10/13/2010,Smart Car,30000

Я прочитал это во фрейме данных следующим образом:

sales_df <- read.table("C:/R_Expt/ItemsSold.csv", header=TRUE, sep=",")

Затем я сделал подмножество, чтобы получить предметы с высокими билетами следующим образом:

big_sales_df <- subset(sales_df, PRICE>100)

big_sales_df

big_sales_df
      CUST         DT         ITEM PRICE
1   BigJoe 10/13/2010 Pickup Truck 20000
3     Jane 10/13/2010    Smart Car 30000
5 GeekyMan 10/13/2010    Smart Car 30000

Так что выглядит нормально.

Когда я пытаюсь построить его через qplot следующим образом:

qplot(nrow, ITEM, data = ddply(big_sales_df, .(ITEM), "nrow"))

полученный график показывает все ЭЛЕМЕНТЫ по оси Y, а не только пикап и умный автомобиль.

Только ddply() производит следующий вывод:

ddply(big_sales_df, .(ITEM), "nrow")
          ITEM nrow
1 Pickup Truck    1
2    Smart Car    2

Поскольку в примере небольшое количество ITEM, график все еще читабельный, но в реальной жизни я пытаюсь построить имена медленных веб-страниц, и, к сожалению, qplot() пытается разместить имена всех веб-страниц по оси Y, и это становится черным пятном.

Я также пробовал sqldf():

qplot(NSOLD, ITEM, data = sqldf('select ITEM, count(*) as NSOLD from big_sales_df group by ITEM order by count(*) desc'))

но это производит тот же сюжет.

Я понял, что subset() каким-то образом несет внутри всю информацию о родителях, а не только совпадающие строки.

Есть ли способ сказать subset(), что он должен хранить только соответствующую информацию?

Или какой-нибудь другой способ subset() носить с собой пустые элементы?

Я знаю, что метод грубой силы может состоять в том, чтобы записать результат subset() в другой файл CSV, а затем прочитать его обратно в data.frame, но я уверен, что есть более простой способ.

Большое спасибо всем вашим гуру R!

Атиш


person Atish    schedule 21.10.2010    source источник


Ответы (3)


Вам необходимо удалить уровни факторов, которые были исключены из вашего подмножества.

big_sales_df$ITEM <- factor(big_sales_df$ITEM)
big_sales_df$CUST <- factor(big_sales_df$CUST)

ИЛИ измените способ чтения данных:

sales_df <- read.csv("ItemsSold.csv", header=TRUE, stringsAsFactors=FALSE)
person Joshua Ulrich    schedule 21.10.2010

Когда вы подмножаете свои данные, факторы, существовавшие в исходном наборе данных, сохраняются. Возьмем, к примеру, набор данных по бриллиантам. У вас есть 5 различных сокращений.

unique(diamonds$cut) ## Ideal, Premium, Good, Very Good, Fair

Если мы подмножим алмазы, мы получим:

str(subset(diamonds, cut == "Ideal")) ## Look at structure

В str() мы видим, что cut сохраняет исходные факторы.

$ cut    : Factor w/ 5 levels "Fair","Good",..: 5 5 5 5 5 5 5 5 5 5 ...

Несмотря на то, что мы убрали все остальные категории разреза, факторинг остался.

Вы можете удалить лишние факторы, рефакторинг столбца с его собственными уникальными подмножествами факторов.

x$cut <- factor(x$cut, labels=unique(x$cut))

Теперь рассмотрим более конкретно ваш пример:

test <- ddply(big_sales_df, .(ITEM), "nrow")
test$ITEM <- factor(test$ITEM, labels=unique(test$ITEM))

Теперь попробуйте еще раз свой заговор.

person Brandon Bertelsen    schedule 21.10.2010
comment
Я опубликовал еще один ответ, который делает то же самое, но на месте в сюжете. В qplot() замените ПУНКТ на фактор (ПУНКТ) - person Brandon Bertelsen; 22.10.2010

Либо можно схитрить по пункту факторинга:

qplot(nrow, factor(ITEM), data = ddply(big_sales_df, .(ITEM), "nrow")
person Brandon Bertelsen    schedule 21.10.2010
comment
К сожалению, я хотел добавить, что в вашем ответе была небольшая опечатка - это должно быть: qplot (nrow, factor (ITEM), data = ddply (big_sales_df, . (ITEM), nrow)) - person Atish; 22.10.2010
comment
И мне это решение нравится больше, так как оно дает мне больше контроля, если я хочу построить график в нескольких измерениях. - person Atish; 22.10.2010
comment
@Atish: если вам нравится это решение, вы должны сделать его принятым ответом. - person Joshua Ulrich; 22.10.2010