如何减少保持其他列的顺序的数据框

时间:2012-06-11 22:38:28

标签: r dataframe plyr data.table

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

我们假设我们有以下数据框:

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

这给了我:

   BENCH CFG      VALUE
1      a   1 0.98828096
2      a   2 0.19630597
3      a   3 0.83539540
4      a   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     d   1 0.29795494
14     d   2 0.91766057
15     d   3 0.68044728
16     d   4 0.18448748

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

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

这给了我预期的结果:

  BENCH     VALUE
1     a 0.9882810
2     b 0.5509479
3     c 0.7784541
4     d 0.9176606

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

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

此减少返回:

  BENCH     VALUE CFG
1     a 0.9882810   4
2     b 0.5509479   4
3     c 0.7784541   4
4     d 0.9176606   4

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

  BENCH     VALUE CFG
1     a 0.9882810   1
2     b 0.5509479   3
3     c 0.7784541   2
4     d 0.9176606   2

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

如何更改减少量以获得显示的最后结果?

3 个答案:

答案 0 :(得分:5)

如果您的问题扩展到大数据(数百万或数百万行和组),则可能会对包data.table感兴趣。这是相关的语法:

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

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

答案 2 :(得分:1)

您可以使用ddply包中的plyr

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