基于特定模式逐行分割数据

时间:2014-10-23 06:22:12

标签: r

很抱歉没有精确标题。我详细说明如下:

我有这样的数据框:

   state
1      v
2      v
3      v
4      v
5      x
6      x
7      x
8      v
9      v
10     x
11     x
12     v
13     v
14     x

我想将其分为三个部分:

第一部分:

   state
1      v
2      v
3      v
4      v
5      x
6      x
7      x

第二部分:

8      v
9      v
10     x
11     x

第三部分:

12     v
13     v
14     x

也就是说,每个部分至少包含两个"状态" (" v"和" x")无论数字和部分是否有模式" v,v,x,x,v" (x后跟v)不应该发生。

2 个答案:

答案 0 :(得分:3)

您可以使用cumsum创建唯一标识符,并使用split拆分数据框。

split(dat, c(0, cumsum(with(dat, state[-1] == "v" & head(state, -1) == "x"))))

其中dat是数据框的名称。

结果是一个包含三个数据框的列表。

$`0`
  state
1     v
2     v
3     v
4     v
5     x
6     x
7     x

$`1`
   state
8      v
9      v
10     x
11     x

$`2`
   state
12     v
13     v
14     x

答案 1 :(得分:0)

尝试:

> n=0
> ddf$new = n
> for(i in 2:nrow(ddf)){
+ if(ddf$state[i] =='v' &&  ddf$state[i-1] =='x') {n=n+1}
+ ddf$new[i] = n
+ }
> split(ddf, ddf$new)
$`0`
   sno state new
1:   1     v   0
2:   2     v   0
3:   3     v   0
4:   4     v   0
5:   5     x   0
6:   6     x   0
7:   7     x   0

$`1`
   sno state new
1:   8     v   1
2:   9     v   1
3:  10     x   1
4:  11     x   1

$`2`
   sno state new
1:  12     v   2
2:  13     v   2
3:  14     x   2