【问题标题】:How to reduce a data frame keeping the order for other columns如何减少保持其他列顺序的数据框
【发布时间】:2012-06-11 22:38:27
【问题描述】:

我正在尝试在给定列上使用 max 函数来减少数据框。我想保留其他列,但保留选择每个最大值的同一行的值。一个例子会让这个解释更容易。

假设我们有以下数据框:

dframe <- data.frame(list(BENCH=sort(rep(letters[1:4], 4)),
                          CFG=rep(1:4, 4),
                          VALUE=runif(4 * 4)
                         ))

这给了我:

基准配置值 1 一 1 0.98828096 2 一 2 0.19630597 3 一 3 0.83539540 4一4 0.90988296 5 b 1 0.01191147 6 b 2 0.35164194 7 b 3 0.55094787 8 b 4 0.20744004 9 c 1 0.49864470 10 c 2 0.77845408 11 c 3 0.25278871 12 c 4 0.23440847 13 天 1 0.29795494 14 天 2 0.91766057 15 天 3 0.68044728 16 天 4 0.18448748

现在,我想减少数据以便为每个不同的 BENCH 选择最大值:

aggregate(VALUE ~ BENCH, dframe, FUN=max)

这给了我预期的结果:

基准值 1 个 0.9882810 2 b 0.5509479 3 c 0.7784541 4 d 0.9176606

接下来,我尝试保留其他列:

aggregate(cbind(VALUE, CFG) ~ BENCH, dframe, FUN=max)

这种减少返回:

基准值 CFG 1个0.9882810 4 2 b 0.5509479 4 3 c 0.7784541 4 4 d 0.9176606 4

使用max 函数减少了VALUE 和CFG。但这不是我想要的。例如,在这个例子中,我想获得:

基准值 CFG 1个0.9882810 1 2 b 0.5509479 3 3 c 0.7784541 2 4 d 0.9176606 2

其中 CFG 没有减少,但它只是保持与每个不同 BENCH 的最大值相关联的值。

我怎样才能改变我的减少以获得最后显示的结果?

【问题讨论】:

    标签: r dataframe plyr data.table


    【解决方案1】:

    如果您的问题扩展到大数据(数百万或数百万行和组),那么包 data.table 可能会引起您的兴趣。以下是相关语法:

    require(data.table)
    dtable <- data.table(dframe)
    dtable[, .SD[which.max(VALUE),], by = BENCH]
    

    【讨论】:

      【解决方案2】:

      这是一个基本的 R 解决方案:

      do.call(rbind, by(dframe, dframe$BENCH, FUN=function(X) X[which.max(X$VALUE),]))
      #   BENCH CFG     VALUE
      # a     a   1 0.9882810
      # b     b   3 0.5509479
      # c     c   2 0.7784541
      # d     d   2 0.9176606
      

      【讨论】:

      • 如果by() 有一个类似simplify 的参数来完成拆分-应用-组合算法,将生成的data.frames 重新组合在一起,那就太好了。它是如此接近......然后让你用那个尴尬的do.call(rbind, ...)构造完成最后一步。
      • +1 用于解决问题。谢谢!实际上,在我看来,它看起来并没有那么糟糕:)
      【解决方案3】:

      您可以使用 plyr 包中的 ddply

      ddply(dframe, 
            .(BENCH), 
            function(df) return(df[df$VALUE==max(df$VALUE),]))
      

      【讨论】:

      • +1 用于解决问题。谢谢!只是一件小事,最后少了一个括号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2017-01-20
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多