根据 TRUE FALSE 语句拆分向量

split vector based on TRUE FALSE statement

我想计算向量中出现的连续负数的长度。 split 似乎是这样做的方法,但我无法指定在哪里进行拆分。例如,给定:

dat<-c(-1,-1,-1,-1,1,1,1,-1,-1,1,1,1)

我希望拆分为return一个长度为8的列表,其中第一个元素的长度为4,第五个元素的长度为2,表示连续的负数序列的长度。我试过:

split(dat, cumsum(dat > 0))

这导致:

$`0`
[1] -1 -1 -1 -1

$`1`
[1] 1

$`2`
[1] 1

$`3`
[1]  1 -1 -1

$`4`
[1] 1

$`5`
[1] 1

$`6`
[1] 1

这是不正确的。我的问题是使用 cumsum,因为这是 returning:

[1] 0 0 0 0 1 2 3 3 3 4 5 6

当我想要它时 return:

[1] 0 0 0 0 1 2 3 4 4 5 6 7

cumsum 似乎是执行此操作的方法,但也许我需要看看其他地方。

也许这有助于拆分成 length 8

的列表
library(data.table)
split(dat, rleid(cumsum(dat > 0) + (dat > 0)))

-输出

$`1`
[1] -1 -1 -1 -1

$`2`
[1] 1

$`3`
[1] 1

$`4`
[1] 1

$`5`
[1] -1 -1

$`6`
[1] 1

$`7`
[1] 1

$`8`
[1] 1