【问题标题】:Unwanted items on a plot情节上不需要的物品
【发布时间】: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 大师!

阿提什

【问题讨论】:

    标签: r ggplot2 dataframe


    【解决方案1】:

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

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

    【讨论】:

    • 哎呀,我的意思是补充一点,您的答案中有一个轻微的错字 - 它应该是:qplot(nrow, factor(ITEM), data = ddply(big_sales_df, .(ITEM), "nrow "))
    • 我更喜欢这个解决方案,因为它给了我更多的控制权,以防我想按多个维度进行绘图。
    • @Atish:如果你喜欢这个解决方案,你应该让它成为公认的答案。
    【解决方案2】:

    当您对数据进行子集化时,原始数据集中存在的因素仍然存在。以钻石数据集为例。您有 5 种不同的切割方式。

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

    如果我们对钻石进行子集化,我们得到:

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

    在 str() 中,我们看到 cut 保留了它原来的因子。

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

    现在,再次尝试你的阴谋。

    【讨论】:

    • 我发布了另一个做同样事情的答案,但在情节中原位。在 qplot() 中,将 ITEM 替换为 factor(ITEM)
    【解决方案3】:

    您需要删除从子集中删除的因子水平。

    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)
    

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 2019-09-30
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 2015-04-10
      相关资源
      最近更新 更多