我想按块总结数字:
这是一个示例数据
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)
不确定为什么对包的约束.他们可以使这更容易.我们可以使用前两列的唯一组合来创建索引.然后与索引进行聚合以进行分组.添加一行以设置名称和数据框架结构:
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答案.