r-基于TRUE-FALSE语句的拆分向量



我想计算矢量中出现的连续负数的长度。拆分似乎是实现这一点的方法,但我很难指定在哪里进行拆分。例如,给定:

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

我希望split返回一个长度为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,因为这是返回:

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

我希望它何时返回:

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

cumsum似乎是这样做的方法,但也许我需要另谋高就。

也许这有助于拆分为length8 列表

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

最新更新