4

我正在尝试使用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

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

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

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

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

4

3 回答 3

5

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

require(data.table)
dtable <- data.table(dframe)
dtable[, .SD[which.max(VALUE),], by = BENCH]
于 2012-06-12T00:08:41.480 回答
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
于 2012-06-11T22:48:46.693 回答
1

你可以ddplyplyr包中使用:

ddply(dframe, 
      .(BENCH), 
      function(df) return(df[df$VALUE==max(df$VALUE),]))
于 2012-06-11T22:46:34.283 回答