我正在尝试使用给定列上的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的最大值相关的值。
如何更改减少量以获得显示的最后结果?
答案 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),]))