根据 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
我想计算向量中出现的连续负数的长度。 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