R 拆分 data.frame 使用表示和 on/off 开关的列

R Split data.frame using a column that represents and on/off switch

我的数据如下所示:

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))))

我想拆分列 z 上的 data.frame a,但将每个组作为单独的 data.frame 作为列表的成员,即在我的列表中例如,前 5 行将是列表中的第一个项目,接下来的 8 行将是列表中的下一个项目,接下来的 3 行将是该项目之后的项目,等等

简单因数将所有 1 和所有 0 组合在一起...

我确信有一种简单的方法可以做到这一点,但目前还没有实现。

谢谢

尝试 data.table v > 1.9.5

中的 rleid 函数
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
....

这里有一些 base R 选项。

  1. 使用rle。 @Spacedman

    评论中 rleid 函数的变体
    split(a,inverse.rle(within.list(rle(a$z), values <- seq_along(values))))
    
  2. 根据相邻元素是否相等创建逻辑索引后使用cumsum

    split(a, cumsum(c(TRUE, a$z[-1]!=a$z[-nrow(a)])))
    

或者,也可以 cumsum:

split(a, c(0, cumsum(diff(a$z) != 0)))