按多列分组并汇总其他多列

use*_*267 19 grouping aggregate r plyr data.table

我有一个包含大约200列的数据框,其中我想要将表格分组前10个左右,这些是因子并将其余列相加.

我有我要分组的所有列名列表以及我想要聚合的所有列的列表.

我正在寻找的输出格式需要是相同数量的cols的相同数据帧,只是组合在一起.

有没有使用包解决方案data.table,plyr或任何其他?

Mat*_*wle 18

data.table的方法是:

DT[, lapply(.SD,sum), by=list(col1,col2,col3,...)]
Run Code Online (Sandbox Code Playgroud)

要么

DT[, lapply(.SD,sum), by=colnames(DT)[1:10]]
Run Code Online (Sandbox Code Playgroud)

其中.SD是(D)ata的(S)ubset,不包括组列.(旁白:如果你需要一般性地引用组列,它们就在.BY.)


Joh*_*ohn 18

在基地R这将是......

aggregate( as.matrix(df[,11:200]), as.list(df[,1:10]), FUN = sum)
Run Code Online (Sandbox Code Playgroud)

编辑:自从我写这篇文章以来,聚合函数已经走了很长的路.以上铸件都不是必需的.

aggregate( df[,11:200], df[,1:10], FUN = sum )
Run Code Online (Sandbox Code Playgroud)

有很多方法可以写这个.假设前10个列a1通过a10I 命名,如下所示,即使它很详细.

aggregate(. ~ a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10, data = dat, FUN = sum)
Run Code Online (Sandbox Code Playgroud)

(您可以使用粘贴来构建公式并使用formula)


Pau*_*tra 16

这似乎是ddply的任务(我使用plyr附带的'baseball'数据集):

library(plyr)
groupColumns = c("year","team")
dataColumns = c("hr", "rbi","sb")
res = ddply(baseball, groupColumns, function(x) colSums(x[dataColumns]))
head(res)
Run Code Online (Sandbox Code Playgroud)

这为每个groupColumns提供了dataColumns中指定的列的总和.


tal*_*lat 12

dplyr方法是:

library(dplyr)
df %>%
  group_by(col1, col2, col3) %>%
  summarise_each(funs(sum))
Run Code Online (Sandbox Code Playgroud)

您可以summarise_each使用帮助文件中提到的特殊功能进一步指定要汇总或排除的列?dplyr::select.


Luc*_*zer 10

使用plyr :: ddply:

library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
Run Code Online (Sandbox Code Playgroud)


Ron*_*hah 5

让我们考虑这个例子:

df <- data.frame(a = 'a', b = c('a', 'a', 'b', 'b', 'b'), c = 1:5, d = 11:15,
                 stringsAsFactors = TRUE)
Run Code Online (Sandbox Code Playgroud)

_all_at_if动词现在均已被取代,我们用across现在把所有的因素列,总结所有其他列,我们可以这样做:

library(dplyr)

df %>% 
   group_by(across(where(is.factor))) %>% 
   summarise(across(everything(), sum))

#  a     b         c     d
#  <fct> <fct> <int> <int>
#1 a     a         3    23
#2 a     b        12    42
Run Code Online (Sandbox Code Playgroud)

对所有因子列和数字列求和进行分组:

df %>% 
  group_by(across(where(is.factor))) %>% 
  summarise(across(where(is.numeric), sum))
Run Code Online (Sandbox Code Playgroud)

我们也可以按位置执行此操作,但必须注意数字,因为它不计算分组列。

df %>% group_by(across(1:2)) %>% summarise(across(1:2, sum))
Run Code Online (Sandbox Code Playgroud)