2010-10-21 3 views
3

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

I читать это в кадр данных следующим образом:

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.

одна 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 там!

Атиш

ответ

1

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

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

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

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

В ул(), мы видим, что покрой поддерживает те факторы, которые она была первоначально.

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

Теперь попробуйте свой участок снова.

+0

Большое спасибо Brandon, что работал просто отлично! – Atish

+1

Я опубликовал другой ответ, который делает то же самое, но in situ в сюжете. IN qplot() заменить ITEM на коэффициент (ITEM) –

1

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

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) 
+0

Спасибо Joshua, ваш подход работал тоже! – Atish

1

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

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

Еще раз спасибо, Брэндон. – Atish

+0

К сожалению, я хотел добавить, что в вашем ответе была небольшая опечатка - это должно быть: qplot (nrow, factor (ITEM), data = ddply (big_sales_df,. (ITEM), "nrow")) – Atish

+0

И мне нравится это решение лучше, так как оно дает мне больше контроля, если я хочу построить несколько измерений. – Atish

Смежные вопросы