【问题标题】:Summarize data frame based on condition根据条件汇总数据框
【发布时间】:2013-07-09 12:11:37
【问题描述】:

我有这种数据集(ID、V1、V2 是我的数据框的 3 个变量):

ID V1 V2 
1  A  10
1  B  5
1  D  1
2  C  9
2  E  8

我想要一个新的数据框,对于每个 ID,V2 中值为 max 的行。例如,结果将是:

ID V1 V2 
1  A  10
2  C  9

【问题讨论】:

  • “max”有关系的情况呢?
  • 就我而言这是不可能的
  • 如果您对data.table 解决方案感兴趣,那么:dt[dt[, .I[which.max(V2)], by=ID]$V1]
  • @Arun,别那么笨拙...
  • @Arun +1,但默认情况下我会使用.SD 解决方案并使用.I 一个iff 速度必须如此(因为.SD 一个更简单,因为它应该固定在未来某个时间点一样快); dt[, .SD[which.max(V2)], by = ID]

标签: r dataframe subset summarization


【解决方案1】:

使用 plyr 包中的ddply(假设数据为样本)

    library(plyr)
    ddply(sample,.(ID),summarize,V1=V1[which.max(V2)],V2=max(V2))

  ID V1 V2
1  1  A 10
2  2  C  9

【讨论】:

    【解决方案2】:

    这是一段笨拙的代码,但它确实有效....

    > mydf[with(mydf, ave(V2, ID, FUN = function(x) x == max(x))) == 1, ]
      ID V1 V2
    1  1  A 10
    4  2  C  9
    

    不那么笨拙:

    do.call(rbind, 
            by(mydf, mydf$ID, 
               FUN = function(x) x[which.max(x$V2), ]))
    #   ID V1 V2
    # 1  1  A 10
    # 2  2  C  9
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2019-03-06
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多