【问题标题】:How to add column when summarising with ddply使用 ddply 进行汇总时如何添加列
【发布时间】:2015-02-12 19:29:35
【问题描述】:

我的问题是用 ddply 函数总结一个 data.frame,例如以下。

该功能用于创建具有最高评级和相应公司的新数据框。缺少的是第一个数据帧中的相应 ID。

我尝试调用 ID 变量,但这会导致错误消息。 我对最高评分对应的ID感兴趣。

非常感谢您提前提供的帮助!

dat <- data.frame(ID = c("A11", "A12", "A21","A22","A23","A31"), 
              company =  c("CompA","CompA","CompB","CompB","CompB","CompC"),
              rating = c(1,4,2,5,3,4)
              )

company  ID ratingMax
1   CompA A11         1
2   CompA A12         4
3   CompB A21         2
4   CompB A22         5
5   CompB A23         3             
6   CompC A31         4

library(plyr)
ddply(dat, "company", summarise, ratingMax = max(rating))

company ratingMax
1   CompA         4
2   CompB         5
3   CompC         4

ddply(dat, "company", summarise, ratingMax = max(rating), ID = ID)
Error: length(rows) == 1 is not TRUE

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    你可以试试

     library(plyr) 
     ddply(dat, "company", summarise, ratingMax = max(rating),
                 ID = ID[which.max(rating)])
     #  company ratingMax  ID
     #1   CompA         4 A12
     #2   CompB         5 A22
     #3   CompC         4 A31
    

    或使用dplyr

     library(dplyr)
     dat %>% 
          group_by(company) %>% 
          summarise(ratingMax=max(rating), ID=ID[which.max(rating)])
     #  company ratingMax  ID
     #1   CompA         4 A12
     #2   CompB         5 A22
     #3   CompC         4 A31
    

    或者你可以使用filter

       dat %>% 
           group_by(company) %>% 
           filter(row_number() %in% which.max(rating))
    

    或者使用@docendo discimus 提出的slice(更快更紧凑)

      dat %>% 
          group_by(company) %>%
          slice(which.max(rating))
    

    【讨论】:

    • slice(which.max(rating)) 在这种情况下会比 filter 好得多 IMO(我希望它也会更快)
    【解决方案2】:

    这里有一个快速的data.table 解决方案,可以省去您手动命名列的麻烦(以防您想要显示更多列)

    library(data.table)
    setDT(dat)[, .SD[which.max(rating)], by = company]
    #    company  ID rating
    # 1:   CompA A12      4
    # 2:   CompB A22      5
    # 3:   CompC A31      4
    

    【讨论】:

    • 明天将在使用大数据集时尝试一下。可能会更快。谢谢!
    • @DavidArenburg 我认为.I 应该比.SD 更快
    • @akrun,我不知道,但是在这种情况下,您建议如何使用.I,如dat[setDT(dat)[, .I[which.max(rating)], by = company]$V1]
    • 我想像setDT(dat)[dat[, .I[which.max(rating)], by=company]$V1]
    • @akrun,没关系,无论如何,我认为这有点过于复杂了。如果 OP 对 plyr 感到满意,则性能在这里不是问题。此外,在不久的将来应该优化.SD,因为这是惯用的data.table 方法。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多