地块上的不需要的物品

时间:2010-10-21 20:58:59

标签: r ggplot2 dataframe

在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轴上的全部 ITEMS,而不仅仅是皮卡和 智能车。

单独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大师!

Atish

3 个答案:

答案 0 :(得分: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))

现在,再试一次你的情节。

答案 1 :(得分: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)

答案 2 :(得分:1)

或者你可以通过分解项目作弊:

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