如何在R中保留其他列的同时聚合某些列?

如何在R中保留其他列的同时聚合某些列?,r,aggregate,R,Aggregate,我有这样一个数据框: id no age 1 1 7 23 2 1 2 23 3 2 1 25 4 2 4 25 5 3 6 23 6 3 1 23 我希望通过id将日期框聚合为如下形式:(如果它们共享相同的id,只需将no相加,但将age保留在那里) 如何使用R实现这一点 假设您的数据帧名为df aggregate(no~id+age, df, sum) # id age no # 1 1

我有这样一个数据框:

     id  no  age
1    1   7   23
2    1   2   23
3    2   1   25
4    2   4   25
5    3   6   23
6    3   1   23
我希望通过
id
将日期框聚合为如下形式:(如果它们共享相同的
id
,只需将
no
相加,但将
age
保留在那里)


如何使用R实现这一点

假设您的数据帧名为
df

aggregate(no~id+age, df, sum)
#   id age no
# 1  1  23  9
# 2  3  23  7
# 3  2  25  5

或者,您可以使用plyr软件包中的
ddply

require(plyr)
ddply(df,.(id,age),summarise,no = sum(no))

在这个特定的例子中,结果是相同的。然而,情况并非总是如此,这两个函数之间的区别已概述。这两种功能都有各自的用途,值得探索,这就是为什么我觉得应该提到这个替代方案

更好,
数据表

library(data.table)
# convert your object to a data.table (by reference) to unlock data.table syntax
setDT(DF)
DF[  , .(sum_no = sum(no), unq_age = unique(age)), by = id]

如果您尚未将其声明为
data.table
(就像您刚才调用
library(data.table)
),则可以使用
setDT(dt)[,list(sum(no),unique(age)),by=id]
。我喜欢
data.table
,但我不知道这是否比上面同样简洁的答案“更好:)公平,但我的意思是,从某种意义上说,这可能会让你开始使用
data.table
,如果红利是无法衡量的;-)为什么在这里使用
unique(age)
?为什么不干脆
dt[和(否),(id,年龄)]
?这里有太多不必要的按键
dt[,sum(no),(id,age)]
对我不起作用<代码>错误。。。找不到函数“”此外,如果要按多个列对
进行分组,并且在输出中还包括多个其他列,则此操作不起作用。当添加更多列时,此操作不起作用,它会将RHS上的每一列视为要按分组的系数列,例如,如果在每个条目中都包含一个额外的列,并带有一个not,那么最终会得到许多重复的行。如果每个id的年龄不一致,而我们只需要第一个年龄,那会怎么样?
library(data.table)
# convert your object to a data.table (by reference) to unlock data.table syntax
setDT(DF)
DF[  , .(sum_no = sum(no), unq_age = unique(age)), by = id]