在R中聚合多列的行

时间:2015-10-04 17:24:33

标签: r

我有一个df,基本上看起来像这样:

Id  A    B    C total
3   5    0    1  6
3   4    3    4   11
3   2    1    2    5
4   5    4    3   12
4   3    2    4    9
4   1    1    1    3

我想通过Id折叠行并获取:

Id   A    B    C    total
3    11   4    7     22
4    9    7    8   24

我能够通过以下方式对一列进行此操作:

df.grouped<- aggregate(df$A~Id, data=df, FUN="sum")

我有很多列(A-Z),所以我需要某种循环。我试过了:

df.grouped<- aggregate(df[4:51]~Id, data=df, FUN="sum")
names(df.grouped)<-paste(names(df)[4:51])

但得到了:

Error in model.frame.default(formula = df[4:51] ~ Id, data = df) : 
invalid type (list) for variable 'df[4:51]'

如您所见,我还希望df.grouped中的名称与df中的名称相同。

任何想法都会非常有用

由于

2 个答案:

答案 0 :(得分:2)

我们可以使用aggregate的公式方法。通过在.的{​​{1}}上指定LHS,我们会选择除了&#39; Id&#39;之外的所有列。列。

~

或者我们也可以在不使用公式方法的情况下指定列

aggregate(.~Id, df, sum)
#   Id  A B C total
#1  3 11 4 7    22
#2  4  9 7 8    24

其他选项包括aggregate(df[2:ncol(df)],df['Id'], FUN=sum) # Id A B C total #1 3 11 4 7 22 #2 4 9 7 8 24 dplyr

使用data.table,我们按“ID&ID”分组。并使用dplyr获取所有列的sum

summarise_each

或者使用library(dplyr) df %>% group_by(Id) %>% summarise_each(funs(sum)) ,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (data.table),按&#39; Id&#39;分组,我们通过Data.table(setDT(df))的子集循环(lapply(..)并获取.SD

sum

答案 1 :(得分:1)

使用summaryBy库中的doBy

library(doBy)
df.grouped = summaryBy(A + B + C + total ~ Id, data = df, FUN = sum,
    keep.names = TRUE)

您可以省略FUN = sum,因为它是默认值。计算长度(计数),平均值或方差时,您可以使用FUN = lengthFUN = mean替换,依此类推。

由于您还要选择数据框的每一列,因此您可以使用. ~ Id作为简写形式。

R:

开箱即用的示例

头(mtcars)   库(doBy)   summaryBy(.~ cyl,data = mtcars,FUN = mean,keep.names = TRUE)

cyl      mpg     disp        hp     drat       wt     qsec        vs        am     gear     carb
1   4 26.66364 105.1364  82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455
2   6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571
3   8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000