根据条件拆分为list(),省略False元素

And*_*ico 4 split r list vector

根据条件将矢量分割成n元素的最优雅方法是什么?

每个单独的true块都应该进入自己的list元素.所有的虚假元素都被扔掉了.

例1:

vec  <- c(1:3,NA,NA,NA,4:6,NA,NA,NA,7:9,NA)
cond <- !is.na(vec)

result = list(1:3,4:6,7:9)
Run Code Online (Sandbox Code Playgroud)

例2:

vec_2  <- c(3:1,11:13,6:4,14:16,9:7,20)
cond_2 <- vec_2 < 10

results_2 = list(3:1,6:4,9:7)
Run Code Online (Sandbox Code Playgroud)

对于向量和相关条件有一个通用的解决方案会很棒.veccond

我最好的尝试:

res   <- split(vec,data.table::rleidv(cond))
odd  <- as.logical(seq_along(res)%%2)
res[if(cond[1])odd else !odd]
Run Code Online (Sandbox Code Playgroud)

mt1*_*022 5

我想这一般应该有效:

> split(vec[cond], data.table::rleid(cond)[cond])
$`1`
[1] 1 2 3

$`3`
[1] 4 5 6

$`5`
[1] 7 8 9
Run Code Online (Sandbox Code Playgroud)

让它成为一个功能:

> f <- function(vec, cond) split(vec[cond], data.table::rleid(cond)[cond])

> f(vec_2, cond_2)
$`1`
[1] 3 2 1

$`3`
[1] 6 5 4

$`5`
[1] 9 8 7
Run Code Online (Sandbox Code Playgroud)