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)
我想这一般应该有效:
> 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)
| 归档时间: |
|
| 查看次数: |
36 次 |
| 最近记录: |