代码之家  ›  专栏  ›  技术社区  ›  James White

删除数据帧列表中的NA值

  •  0
  • James White  · 技术社区  · 7 年前

    我相信有一个非常简单的答案,但我找不到。在另一个岗位上, How do I remove empty data frames from a list? 我已经研究过从数据帧列表中删除空数据帧。

    但是,当列表中的一个项没有被分类为数据帧并且只是一个NA值时,您如何做到这一点呢?稍微修改上述问题的参数,您就有:

    M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
    M2 <- NA
    M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2))
    mlist <- list(M1, M2, M3)
    

    在这个例子中,我想删除M2,但是我有几个空数据帧的例子,所以我想要一个同时删除它们的函数。

    对于上述问题,我尝试了几种不起作用的解决方案:

    mlist[sapply(mlist, function(x) dim(x)[1]) > 0]##Error message -
    ##Error: (list) object cannot be coerced to type 'double'
    
    Filter(function(x) dim(x), mlist) ###Incorrect outputs
    

    提前感谢您的帮助!

    3 回复  |  直到 7 年前
        1
  •  3
  •   markus    7 年前

    一种选择是使用 Filter 检查列表元素是否 data.frame

    Filter(is.data.frame, mlist)
    #[[1]]
    #  X1 X2
    #1  1  3
    #2  2  4
    
    #[[2]]
    #  X1 X2
    #1  9 11
    #2 10 12
    
        2
  •  2
  •   Randall Helms    7 年前

    这里有一个稍微不同的方法来得到你的结果

    library(tidyverse)
    
    M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
    M2 <- NA
    M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2))
    M4 <- NA
    mlist <- list(M1, M2, M3,M4)
    
    indexes <- tibble()
    
    for (i in 1:length(mlist)) {
    
      if (is.na(mlist[[i]]) == TRUE) {
    
        new_index <- tibble(index = i)
    
        indexes <- bind_rows(new_index,indexes)
    
      }
    }
    
    indexnums <- indexes %>% pull(index)
    
    mlist <- mlist[-indexnums]
    

        3
  •  1
  •   Darren Tsai    7 年前

    # Method 1
    mlist[!is.na(mlist)]
    
    # Method 2
    replace(mlist, is.na(mlist), NULL)
    
    推荐文章