R中的块总结数字

Yuk*_*kun 2 r sum

我想按块总结数字:

这是一个示例数据

 data=matrix(c(0,0,0,1,1,0,1,1,1,1,1,0,0,1,0,0,1.2,2.3,1.3,1.5,2.5,2.1,2.3,1.2),
             ncol=3,dimnames=list(c(),c("low","high","time")))

     low high time
 [1,]   0    1  1.2
 [2,]   0    1  2.3
 [3,]   0    1  1.3
 [4,]   1    0  1.5
 [5,]   1    0  2.5
 [6,]   0    1  2.1
 [7,]   1    0  2.3
 [8,]   1    0  1.2
Run Code Online (Sandbox Code Playgroud)

我想得到

       n  sum
 [1,]  3  4.8
 [2,]  2  4
 [3,]  1  2.1
 [4,]  2  3.5
Run Code Online (Sandbox Code Playgroud)

不使用任何包裹.用R怎么做?

或者,如果我能得到

       n/low n/high sum
 [1,]  0       3    4.8
 [2,]  2       0    4
 [3,]  0       1    2.1
 [4,]  2       0    3.5
Run Code Online (Sandbox Code Playgroud)

Pie*_*une 9

不确定为什么对包的约束.他们可以使这更容易.我们可以使用前两列的唯一组合来创建索引.然后与索引进行聚合以进行分组.添加一行以设置名称和数据框架结构:

ind <- with(rle(do.call(paste, df1[1:2])), rep(1:length(values), lengths))
a <- aggregate(df1$time, list(ind), function(x) c(length(x), sum(x)))[-1]
setNames(do.call(data.frame, a), c("n", "sum"))

  n sum
1 3 4.8
2 2 4.0
3 1 2.1
4 2 3.5
Run Code Online (Sandbox Code Playgroud)

通过以下方面的帮助来说明它是多么简单data.table:

library(data.table)
setDT(df1)[, .(.N, sum(time)), by=rleid(low, high)]
Run Code Online (Sandbox Code Playgroud)

更新

有关后续问题,请参阅评论中的@bgoldst答案.