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行)。显然,如果你以后想做其他事情,方法也必须改变