22

我有一个包含大约 200 列的数据框,其中我想将表按前 10 个左右分组,这些是因子并对其余列求和。

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

我正在寻找的输出格式需要是具有相同列数的相同数据帧,只是组合在一起。

是否有使用 packages 或任何其他解决data.table方案plyr

4

7 回答 7

21

data.table的方式是:

DT[, lapply(.SD,sum), by=list(col1,col2,col3,...)]

或者

DT[, lapply(.SD,sum), by=colnames(DT)[1:10]]

其中.SD是 (D)ata 的 (S) 子集,不包括组列。(旁白:如果您需要泛指组列,它们位于.BY.)

于 2011-11-21T14:01:38.357 回答
19

在基础 R 中,这将是...

aggregate( as.matrix(df[,11:200]), as.list(df[,1:10]), FUN = sum)

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

aggregate( df[,11:200], df[,1:10], FUN = sum )

并且有多种方式来写这个。假设前 10 列是a1通过a10我喜欢以下命名的,即使它很冗长。

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

(您可以使用 paste 来构造公式并使用formula

于 2011-11-21T14:40:05.273 回答
18

这似乎是 ddply 的一项任务(我使用 plyr 中包含的“棒球”数据集):

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

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

于 2011-11-21T13:50:27.743 回答
17

dplyr方法是:

library(dplyr)
df %>%
  group_by(col1, col2, col3) %>%
  summarise_each(funs(sum))

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

于 2015-10-22T15:04:09.823 回答
10

使用 plyr::ddply:

library(plyr)
ddply(dtfr, .(name1, name2, namex), numcolwise(sum))
于 2011-11-21T13:46:49.470 回答
6

让我们考虑这个例子:

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

_all,动词现在已被取代,我们现在使用_at对所有因子列进行分组并对所有其他列求和,我们可以这样做:_ifacross

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

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

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

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

df %>% group_by(across(1:2)) %>% summarise(across(1:2, sum))
于 2020-06-25T01:38:45.823 回答
2

使用通用的 dplyr 执行此操作的另一种方法(不需要列列表)是:

df %>% group_by_if(is.factor) %>% summarize_if(is.numeric,sum,na.rm = TRUE)
于 2018-03-19T17:43:29.380 回答