很抱歉没有精确标题。我详细说明如下:
我有这样的数据框:
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)不应该发生。
答案 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