【发布时间】:2011-04-28 20:35:45
【问题描述】:
在 R 中使用 data.frame 的子集时遇到问题。
子集被正确创建和显示,但是当我尝试使用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
由于该示例的 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 大师!
阿提什
【问题讨论】: