代码之家  ›  专栏  ›  技术社区  ›  Andre Elrico

根据条件拆分为list(),忽略假元素

  •  4
  • Andre Elrico  · 技术社区  · 6 年前

    根据一个条件,将一个向量分割成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 回复  |  直到 6 年前
        1
  •  5
  •   mt1022    6 年前

    我想这应该是正常的:

    > 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
    
        2
  •  1
  •   akrun    6 年前

    这是一个 base R 选项 rle

    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

    grp <- cumsum(c(TRUE, diff(cond) < 0)) * NA^ is.na(vec)