3 回答
TA贡献1909条经验 获得超7个赞
基本的R解决方案是将的输出aggregate()与一个merge()步骤结合起来。我发现公式接口aggregate()比标准接口更有用,部分原因是输出中的名称更好,所以我将使用它:
该aggregate()步骤是
maxs <- aggregate(Score ~ Group, data = dat, FUN = max)
这merge()一步很简单
merge(maxs, dat)
这给了我们想要的输出:
R> maxs <- aggregate(Score ~ Group, data = dat, FUN = max)
R> merge(maxs, dat)
Group Score Info
1 1 3 c
2 2 4 d
当然,您可以将其粘贴为单线(中介步骤更多用于说明):
merge(aggregate(Score ~ Group, data = dat, FUN = max), dat)
我使用公式接口的主要原因是它返回的数据帧具有正确names的合并步骤。这些是原始数据集中的列的名称dat。我们需要具有aggregate()正确名称的输出,以便merge()知道原始数据帧和聚合数据帧中的哪些列匹配。
标准接口给出奇数名称,无论您以哪种方式调用它:
R> aggregate(dat$Score, list(dat$Group), max)
Group.1 x
1 1 3
2 2 4
R> with(dat, aggregate(Score, list(Group), max))
Group.1 x
1 1 3
2 2 4
我们可以merge()在这些输出上使用,但是我们需要做更多的工作告诉R哪些列匹配。
TA贡献1744条经验 获得超4个赞
这是使用该plyr包装的解决方案。
下面的代码行实际上告诉ddply我们首先按组对数据进行分组,然后在每个组内返回一个子集,其中“分数”等于该组中的最大分数。
library(plyr)
ddply(data, .(Group), function(x)x[x$Score==max(x$Score), ])
Group Score Info
1 1 3 c
2 2 4 d
而且,正如@SachaEpskamp指出的那样,可以将其进一步简化为:
ddply(df, .(Group), function(x)x[which.max(x$Score), ])
(which.max如果有的话,它还具有返回多条最大行的优点)。
- 3 回答
- 0 关注
- 396 浏览
添加回答
举报