2010-10-21 58 views
3

我有一個問題,而使用data.frame的一個子集R.不需要的物品

子集被創建並正確顯示出來,但是當我嘗試使用qplot()繪製它,沒有被選擇的行沿subset()也沿着一個軸顯示。

我讀在實際的文件是一個Web服務器日誌,但我已經創建了一個小例子來說明我的問題:

這是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 

由於例如有一個小數量的項目,該地塊仍是可讀的,但在現實生活中,我試圖繪製慢網頁的名稱頁面,不幸的是,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大師!

Atish

回答

1

當子集的數據,在原始數據集存在的因素依然存在。以鑽石數據集爲例。你有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)) 

現在,再試一次您的情節。

+0

非常感謝布蘭登,這工作就好了! – Atish 2010-10-21 22:23:23

+1

我發佈了另一個答案,但是在劇情中原地相同。 IN qplot()用因子(ITEM)代替ITEM – 2010-10-21 22:25:49

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 2010-10-21 22:26:21

1

或者您也可以通過分解項目騙:

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

再次感謝布蘭登。 – Atish 2010-10-21 23:48:15

+0

糟糕,我的意思是補充說在你的答案中有一個輕微的錯字 - 它應該是:qplot(nrow,factor(ITEM),data = ddply(big_sales_df,。(ITEM),「nrow」)) – Atish 2010-10-21 23:48:40

+0

這個解決方案更好,因爲它給了我更多的控制權,以防我想通過多個維度進行繪圖。 – Atish 2010-10-21 23:49:36