使用这样的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
?理想情况下是一个班轮。
答案 0 :(得分:3)
您可以使用accumulate = TRUE参数在基数R中使用split
和Reduce
执行此操作。 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