我有一个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中的名称相同。
任何想法都会非常有用
由于
答案 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 = length
或FUN = 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