使用ddply将函数应用于一组行

Jos*_*eke 9 grouping r plyr

我使用ddply相当多但我不认为自己是专家.我有一个数据框(df),其分组变量"Group"具有值"A","B"和"C"以及要汇总的变量,"Var"具有数值.如果我使用

ddply(df, .(Group), summarize, mysum=sum(Var))
Run Code Online (Sandbox Code Playgroud)

然后我得到每个A,B和C的总和,这是正确的.但我想要做的是将每个Group变量分组相加,因为它们在数据框中排列.例如,如果数据框有

Group    Var
A        1.3
A        1.2
A        0.4
B        0.3
B        1.3
C        1.5
C        1.7
C        1.9
A        2.1
A        2.4
B        6.7
Run Code Online (Sandbox Code Playgroud)

期望的结果

A        2.9
B        1.6
C        5.1
A        4.5
B        6.7
Run Code Online (Sandbox Code Playgroud)

因此,所需的输出对每个Group变量分组执行数学函数,而不是对各个Group变量的所有实例执行数学函数.这可以在ddply中完成吗?

数据

dat <- structure(list(Group = c("A", "A", "A", "B", "B", "C", "C", "C", "A", "A", "B"),
                      Var = c(1.3, 1.2, 0.4, 0.3, 1.3, 1.5, 1.7, 1.9, 2.1, 2.4, 6.7)),
                 .Names = c("Group", "Var"), class = "data.frame", row.names = c(NA, -11L))
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 14

这是使用v1.9.6中最近实现的rleid()函数执行此操作的一种方法data.table.见#686.

这会根据需要生成分组ID:

require(data.table) ## v1.9.6+
DT = as.data.table(dat)
rleid(DT$Group)
# [1] 1 1 1 2 2 3 3 3 4 4 5
Run Code Online (Sandbox Code Playgroud)

我们可以直接使用它来汇总如下:

DT[, .(sum=sum(Var)), by=.(Group, rleid(Group))]
#    Group rleid sum
# 1:     A     1 2.9
# 2:     B     2 1.6
# 3:     C     3 5.1
# 4:     A     4 4.5
# 5:     B     5 6.7
Run Code Online (Sandbox Code Playgroud)

HTH