Нежелательные предметы на участке - PullRequest
3 голосов
/ 22 октября 2010

У меня проблема при использовании подмножества 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, а не только Пикап и Smart Car.

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

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

Поскольку в примере небольшое количество ПУНКТОВ, сюжет по-прежнему читабелен, но в реальной жизни я пытаюсь отобразить названия медленных веб-страниц и, к сожалению, 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-гуру!

Атиш

Ответы [ 3 ]

1 голос
/ 22 октября 2010

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

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)
1 голос
/ 22 октября 2010

Или вы можете обмануть путем факторинга элемента:

qplot(nrow, factor(ITEM), data = ddply(big_sales_df, .(ITEM), "nrow")
1 голос
/ 22 октября 2010

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

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

Если мы подгруппируем алмазы, мы получим:

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

В str () мы видим, что сокращение поддерживает факторы, которые оно имело изначально.

$ 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))

Теперь попробуйте еще раз ваш график.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...