从列表中删除包含NA的列表(R语言)

7

我有一个列表,其中可能包含NA值。

如何删除完全由NA值填充的列表,同时注意如果列表中有非NA值,则这些值和NA值都不应该被删除?

以下是输入示例:

myList <- list()
myList[[1]] <- c(1,2,3)
myList[[2]] <- c(4,5)
myList[[3]] <- c(NA,NA,NA,NA,NA)
myList[[4]] <- c(NA, 6, 7, NA)
myList[[5]] <- NA

期望的输出是:
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
[1] NA  6  7 NA

到目前为止,我已经能够完成以下事项:

test <- lapply(myList, function(x) x[!all(is.na(x))])

并且得到以下输出:

[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
logical(0)

[[4]]
[1] NA  6  7 NA

[[5]]
logical(0)

这也可以工作:myList[!sapply(myList, function(x) all(is.na(x)))] - kangaroo_cliff
1
这不是一个列表的列表,而是一个向量的列表。 - Andre Elrico
4个回答

5
另一个选项是discard
library(purrr)
discard(myList, ~ all(is.na(.x)))
#[1]]
#[1] 1 2 3

#[[2]]
#[1] 4 5

#[[3]]
#[1] NA  6  7 NA

5

过滤器 来拯救:

Filter(function(x) !all(is.na(x)), myList)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 4 5
#
#[[3]]
#[1] NA  6  7 NA

4

您可以使用至少有一个非 NA 值的列表元素:

> myList[sapply(myList, function(x) sum(!is.na(x))) > 0]
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5

[[3]]
[1] NA  6  7 NA

0

你可以通过将NULL赋值给它来“删除”元素。

myList[sapply(myList,function(x) all(is.na(x)))] <- NULL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接