【问题标题】:Remove null value from nested list in R [duplicate]从R中的嵌套列表中删除空值[重复]
【发布时间】:2019-11-17 22:05:59
【问题描述】:

我有一个嵌套的数据框列表。在这些数据框中,我有 NA 变量(现在是向量?)。我想删除这些元素。

编辑:实际上我有 NULL 而不是 NA。

df.ls <- list(list(id = NULL, x = 3, works = NULL),
                 list(id = 2, x = 4, works = NULL),
              NULL)

我试过这段代码,但不知道如何判断它应该使用哪个级别。

df.ls[sapply(df.ls, is.null)] <- NULL

【问题讨论】:

  • @Cath 这个解决方案对我有用。我没有找到它,因为我搜索的是 NA 而不是 NULL,我的情况就是这样。
  • 这是否重复取决于 OPs 数据是具有单个长度元素的列表列表还是 data.frames 列表。

标签: r list dataframe null


【解决方案1】:

对于NULL 值我们可以做

l1 <- lapply(df.ls, function(x) x[lengths(x) > 0])

对于NAs 我们可以做

l1 <- lapply(df.ls, function(x) x[!is.na(x)])
l1

#[[1]]
#[[1]]$x
#[1] 3


#[[2]]
#[[2]]$id
#[1] 2

#[[2]]$x
#[1] 4


#[[3]]
#list()

如果你想删除空列表,你可以这样做

l1[lengths(l1) >  0]

【讨论】:

    【解决方案2】:

    删除NULL

    discard(map(df.ls, ~ discard(.x, is.null)), is.null)
    #[[1]]
    #[[1]]$x
    #[1] 3
    
    
    #[[2]]
    #[[2]]$id
    #[1] 2
    
    #[[2]]$x
    #[1] 4
    

    或者在base R 中加上Filteris.null

    Filter(Negate(is.null), lapply(df.ls, function(x) Filter(Negate(is.null), x)))
    

    OP 更新前的早期版本

    library(purrr)
    map(df.ls, ~ .x[!is.na(.x)])
    #[[1]]
    #[[1]]$x
    #[1] 3
    
    
    #[[2]]
    #[[2]]$id
    #[1] 2
    
    #[[2]]$x
    #[1] 4
    
    
    #[[3]]
    #list()
    

    【讨论】:

      【解决方案3】:

      我不确定您要做什么,因为您说您有一个 data.frames 列表,但您提供的示例只是一个长度为 1 的列表列表。

      假设您有一个 data.frames 列表,其中又包含长度 > 1 的向量,并且您想要删除所有“仅”包含 NA 的列。

      df.ls <- list(data.frame(id = c(NA,NA,NA),
                               x = c(NA,3,5),
                               works = c(4,5,NA)),
                    data.frame(id = c("a","b","c"),
                               x = c(NA,3,5),
                               works = c(NA,NA,NA)),
                    data.frame(id = c("e","d",NA),
                               x = c(NA,3,5),
                               works = c(4,5,NA)))
      
      
      
      >   [[1]]
            id  x works
          1 NA NA     4
          2 NA  3     5
          3 NA  5    NA
      
          [[2]]
            id  x works
          1  a NA    NA
          2  b  3    NA
          3  c  5    NA
      
          [[3]]
              id  x works
          1    e NA     4
          2    d  3     5
          3 <NA>  5    NA
      

      那么这个方法就行了:

          library(dplyr)
          library(purrr)
          non_empty_col <- function(x) {
              sum(is.na(x)) != length(x)
          }
      
          map(df.ls, ~ .x %>% select_if(non_empty_col))
      

      这会返回您的 data.frames 列表,其中不包含仅包含 NA 的列。

      [[1]]
         x works
      1 NA     4
      2  3     5
      3  5    NA
      
      [[2]]
        id  x
      1  a NA
      2  b  3
      3  c  5
      
      [[3]]
          id  x works
      1    e NA     4
      2    d  3     5
      3 <NA>  5    NA
      

      但是,如果您希望您的列表在每个 data.frame(没有 NA 的行)中只包含完整的案例,那么以下代码将起作用。

      library(dplyr)
      map(df.ls, ~ .x[complete.cases(.x), ])
      

      就我的示例数据而言,只剩下 data.frame 3 的第 2 行。

      【讨论】:

        猜你喜欢
        • 2019-09-08
        • 2016-10-19
        • 2021-08-21
        • 1970-01-01
        • 2023-02-06
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        相关资源
        最近更新 更多