R 如何获得具有多个列的每个组的顶部元素?
我的用例如下所示。基本上我有一个三列的数据框。我想按两列R 如何获得具有多个列的每个组的顶部元素?,r,dataframe,R,Dataframe,我的用例如下所示。基本上我有一个三列的数据框。我想按两列(c1,c2)分组,并对第三列c3求和。然后我只想选择最大值为c3(在所有c2中)的前1个c1,也就是说,排序是不必要的,因为我只对最大值感兴趣 library(plyr) df <- data.frame(c1=c('a','a','a','b','b','c'),c2=c('x','y','y','x','y','x'),c3=c(1,2,3,4,5,6)) df c1 c2 c3 1 a x 1 2 a y 2
(c1,c2)
分组,并对第三列c3
求和。然后我只想选择最大值为c3
(在所有c2
中)的前1个c1
,也就是说,排序是不必要的,因为我只对最大值感兴趣
library(plyr)
df <- data.frame(c1=c('a','a','a','b','b','c'),c2=c('x','y','y','x','y','x'),c3=c(1,2,3,4,5,6))
df
c1 c2 c3
1 a x 1
2 a y 2
3 a y 3
4 b x 4
5 b y 5
6 c x 6
sel <- plyr::ddply(df, c('c1','c2'), plyr::summarize,c3=sum(c3))
sel[with(sel, order(c1,-c3)),]
c1 c2 c3
2 a y 5 <<< this one highest c3 for (c1,c2) combination
1 a x 1
4 b y 5 <<< this one highest c3 for (c1,c2) combination
3 b x 4
5 c x 6 <<< this one highest c3 for (c1,c2) combination
库(plyr)
df来自dplyr
的另一种解决方案
library(dplyr)
df2 <- df %>%
group_by(c1, c2) %>%
summarise(c3 = sum(c3)) %>%
filter(c3 == max(c3))
df2
# A tibble: 3 x 3
# Groups: c1 [3]
c1 c2 c3
<fctr> <fctr> <dbl>
1 a y 5
2 b y 5
3 c x 6
库(dplyr)
df2%
组别(c1,c2)%>%
总结(c3=总和(c3))%>%
过滤器(c3==最大值(c3))
df2
#一个tibble:3x3
#组别:c1[3]
c1 c2 c3
1 a y 5
2 b y 5
3cx6
使用dplyr
:
df %>%
group_by(c1, c2) %>%
summarise(c3 = sum(c3)) %>%
top_n(1, c3)
或者最后一行可以是切片(which.max(c3))
,这将保证一行。下面是一个基本的R方法:
df2 <- aggregate(c3~c1+c2, df, sum)
subset(df2[order(-df2$c3),], !duplicated(c1))
# c1 c2 c3
#3 c x 6
#4 a y 5
#5 b y 5
df2这里是另一个带有data.table的选项
library(data.table)
setDT(df)[, .(c3 = sum(c3)) , .(c1, c2)][, .SD[which.max(c3)], .(c1)]
# c1 c2 c3
#1: a y 5
#2: b y 5
#3: c x 6
按c1+c2的组求和c3后,每组c1+c2中只有一行。事实上,你是对的。我编辑了这个问题。我对所有c2
中最大c3
的c1
感兴趣,我喜欢它,因为它很简单,只使用基本的。。。然而,我担心的是!重复
位,因为没有规范合约,它必须选择找到的第一个。。。这是一个实现选择,如果发生更改,那么解决方案将中断?GiovanniAzua,我不确定是否理解您的问题。这种方法通过减少c3总和进行排序,然后每c1选取第一行(=最大c3行)。显然,如果你以后想做其他事情,方法也必须改变