3 回答

TA貢獻1909條經(jīng)驗 獲得超7個贊
基本的R解決方案是將的輸出aggregate()與一個merge()步驟結合起來。我發(fā)現(xiàn)公式接口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)
我使用公式接口的主要原因是它返回的數(shù)據(jù)幀具有正確names的合并步驟。這些是原始數(shù)據(jù)集中的列的名稱dat。我們需要具有aggregate()正確名稱的輸出,以便merge()知道原始數(shù)據(jù)幀和聚合數(shù)據(jù)幀中的哪些列匹配。
標準接口給出奇數(shù)名稱,無論您以哪種方式調用它:
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條經(jīng)驗 獲得超4個贊
這是使用該plyr包裝的解決方案。
下面的代碼行實際上告訴ddply我們首先按組對數(shù)據(jù)進行分組,然后在每個組內返回一個子集,其中“分數(shù)”等于該組中的最大分數(shù)。
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如果有的話,它還具有返回多條最大行的優(yōu)點)。
- 3 回答
- 0 關注
- 432 瀏覽
添加回答
舉報