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

时间:2015-03-18 12:52:52

标签: r dataframe

我的数据如下所示:

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组合在一起......

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

由于

3 个答案:

答案 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选项。

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

答案 2 :(得分:2)

或者cumsum

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