【问题标题】:Split vector by each NA in R按 R 中的每个 NA 拆分向量
【发布时间】:2022-12-30 07:00:24
【问题描述】:

我有以下名为 input 的矢量:

input <- c(1,2,1,NA,3,2,NA,1,5,6,NA,2,2)

[1]  1  2  1 NA  3  2 NA  1  5  6 NA  2  2

我想按每个 NA 将这个向量分成多个向量。所以所需的输出应该是这样的:

> output
[[1]]
[1] 1 2 1

[[2]]
[1] 3 2

[[3]]
[1] 1 5 6

[[4]]
[1] 2 2

如您所见,每次出现 NA 时,它都会分裂成一个新向量。所以我想知道是否有人知道如何将每个 NA 的向量拆分为多个向量?

【问题讨论】:

    标签: r vector split


    【解决方案1】:

    使用与@tpetzoldt 类似的逻辑,但在拆分前删除 NA:

    split(na.omit(input), cumsum(is.na(input))[!is.na(input)])
    
    $`0`
    [1] 1 2 1
    
    $`1`
    [1] 3 2
    
    $`2`
    [1] 1 5 6
    
    $`3`
    [1] 2 2
    

    【讨论】:

      【解决方案2】:

      一种方法可能如下所示:

      1. 识别NAs
      2. cumsum
      3. 根据累计和拆分
      4. 删除NAs
        input <- c(1,2,1,NA,3,2,NA,1,5,6,NA,2,2)
        tmp <- cumsum(is.na(input))
        lapply(split(input, tmp), na.omit)
        

      【讨论】:

      • 它有点冗长,但如果您删除na.omit:lapply(split(input, tmp), (x) na.omit(x) |&gt; magrittr::set_attributes(NULL) )之后的属性,您可以获得更清晰的解决方案。或者将匿名函数调整为 base R。
      • 感谢@Santiago 的建议。没有额外的包,也可以使用 lapply(split(input, tmp), na.omit) |&gt; lapply((x) {attributes(x) &lt;- NULL; x})
      【解决方案3】:

      这个太冗长太复杂了,但对我来说更容易想到这样的问题,只是想分享一下:

      library(tidyverse)
      
      tibble(input) %>% 
        group_by(id = cumsum(is.na(input))) %>% 
        na.omit %>% 
        group_split() %>% 
        map(.,~(.x %>%select(-id))) %>% 
        map(.,~(.x %>%pull))
      
      
      [[1]]
      [1] 1 2 1
      
      [[2]]
      [1] 3 2
      
      [[3]]
      [1] 1 5 6
      
      [[4]]
      [1] 2 2
      

      【讨论】:

        【解决方案4】:

        这是一个不冗长的解决方案:

        strsplit(paste(input, collapse = " "), " NA ")
        [[1]]
        [1] "1 2 1" "3 2"   "1 5 6" "2 2" 
        

        【讨论】:

        • 这非常优雅,但输出是一个向量列表,而不是每个项目都是一个向量的列表
        【解决方案5】:

        将一个向量按每个 NA 值拆分为多个向量的一种方法是使用 R 中的 split 函数。

        这是您如何执行此操作的示例:

        创建输入向量中 NA 值位置的索引

        na_indices <- which(is.na(input))

        按 NA 值将输入向量拆分为向量列表

        输出 <- 拆分(输入,cumsum(c(1,差异(na_indices)> 1)))

        这将创建一个名为 output 的列表,其中包含多个向量,每个向量代表输入向量中的一组连续值,这些值由一个或多个 NA 值分隔。

        然后,您可以使用索引访问列表中的每个向量,例如:

        output[[1]] # 访问列表中的第一个向量 output[[2]] # 访问列表中的第二个向量

        我希望这有帮助!如果您有任何问题,请告诉我。

        【讨论】:

          猜你喜欢
          • 2021-04-27
          • 1970-01-01
          • 2019-09-10
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多