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

时间:2018-08-22 15:23:58

标签: r list vector split

根据条件将向量拆分为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)

示例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)

最好为向量vec和相关条件cond提供一个一般解

我的最佳尝试:

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

2 个答案:

答案 0 :(得分:5)

我想这应该可以正常工作:

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

$`3`
[1] 4 5 6

$`5`
[1] 7 8 9

让它成为一个功能:

> 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

答案 1 :(得分:1)

这里是base R的{​​{1}}选项

rle

与“ vec_2”类似

grp <- with(rle(cond), rep(seq_along(values) * NA^ !values, lengths))
split(vec[cond], grp[cond])
#$`1`
#[1] 1 2 3

#$`3`
#[1] 4 5 6

#$`5`
#[1] 7 8 9

或使用grp <- with(rle(cond_2), rep(seq_along(values) * NA^ !values, lengths)) split(vec_2[cond_2], grp[cond_2]) #$`1` #[1] 3 2 1 #$`3` #[1] 6 5 4 #$`5` #[1] 9 8 7 cumsum创建分组变量

diff