删除数据框列表中的 NA 值

Remove NA value within a list of dataframes

我确定对此有一个非常简单的答案,但我找不到。在单独的 post、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

提前感谢您的帮助!

一种选择是使用 [=f11=] 检查列表元素是否 data.frames

Filter(is.data.frame, mlist)
#[[1]]
#  X1 X2
#1  1  3
#2  2  4

#[[2]]
#  X1 X2
#1  9 11
#2 10 12

希望能帮到你。

# Method 1
mlist[!is.na(mlist)]

# Method 2
replace(mlist, is.na(mlist), NULL)

获取结果的方法略有不同

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]

有了这个,您检查每个列表元素是否为 NA,然后将索引号添加到 table 如果是,然后您将这些索引号拉出并将列表子集化。如果你的数据集中有很多这样的东西,这应该将它们全部删除。