按可变级别累计分割数据帧

时间:2017-02-24 00:52:19

标签: r

使用这样的df:

x=data.frame(id=c(1,1,1,2,2,2,3,3,3), val=c(1,2,3,2,3,4,1,3,0))

我想得到这样的输出:

[[1]]
  id val
1  1   1
2  1   2
3  1   3

[[2]]
  id val
1  1   1
2  1   2
3  1   3
4  2   2
5  2   3
6  2   4

[[3]]
  id val
1  1   1
2  1   2
3  1   3
4  2   2
5  2   3
6  2   4
7  3   1
8  3   3
9  3   0

其中df被分成与分裂变量的级别一样多的数据帧的列表,即id。每个数据框应从第一级开始,并包括每个连续级别的所有行。

我可以通过循环执行此操作:

out<-NULL
for(i in 1:3){
 out[[i]] <- x[x$id<=i,]
}
out

然而,是否有更简单的方法使用例如我忽略了split?理想情况下是一个班轮。

1 个答案:

答案 0 :(得分:3)

您可以使用accumulate = TRUE参数在基数R中使用splitReduce执行此操作。 split用于按版ID将data.frame拆分为data.frames列表。 Reduce适用于rbind到每个列表元素,添加accumulate = TRUE会连续组合列表中的data.frames。

Reduce(rbind, split(x, x$id), accumulate=TRUE)
[[1]]
  id val
1  1   1
2  1   2
3  1   3

[[2]]
  id val
1  1   1
2  1   2
3  1   3
4  2   2
5  2   3
6  2   4

[[3]]
  id val
1  1   1
2  1   2
3  1   3
4  2   2
5  2   3
6  2   4
7  3   1
8  3   3
9  3   0