我的数据如下所示:
a <- data.frame(cbind(x=seq(50),
y=rnorm(50),
z=c(rep(0,5),
rep(1,8),
rep(0,3),
rep(1,2),
rep(0,12),
rep(1,12),
rep(0,8))))
我想在列a
上拆分data.frame z
,但是将每个组作为单独的data.frame
作为列表的成员,即在我的示例中,前5个行将是列表中的第一个项目,接下来的8行将成为列表中的下一个项目,接下来的3行将是该项目之后的项目等。
简单因素将所有1组合在一起,将所有0组合在一起......
我确信有一种简单的方法可以做到这一点,但目前尚未实现。
由于
答案 0 :(得分:4)
尝试rleid
v > 1.9.5
data.table
功能
library(data.table)
split(a, rleid(a$z))
# $`1`
# x y z
# 1 1 -0.03737561 0
# 2 2 -0.48663043 0
# 3 3 -0.98518106 0
# 4 4 0.09014355 0
# 5 5 -0.07703517 0
#
# $`2`
# x y z
# 6 6 0.3884339 1
# 7 7 1.5962833 1
# 8 8 -1.3750668 1
# 9 9 0.7987056 1
# 10 10 0.3483114 1
# 11 11 -0.1777759 1
# 12 12 1.1239553 1
# 13 13 0.4841117 1
....
答案 1 :(得分:2)
以下是一些base R
选项。
使用rle
。 @Spacedman评论中rleid
函数的变体
split(a,inverse.rle(within.list(rle(a$z), values <- seq_along(values))))
根据相邻元素是否相等创建逻辑索引后使用cumsum
split(a, cumsum(c(TRUE, a$z[-1]!=a$z[-nrow(a)])))
答案 2 :(得分:2)
或者cumsum
:
split(a, c(0, cumsum(diff(a$z) != 0)))