我有一个列表列表,其中可能包含 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
Run Code Online (Sandbox Code Playgroud)
所需的输出是:
[[1]]
[1] 1 2 3
[[2]]
[1] 4 5
[[3]]
[1] NA 6 7 NA
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够做到:
test <- lapply(myList, function(x) x[!all(is.na(x))])
Run Code Online (Sandbox Code Playgroud)
并作为输出:
[[1]]
[1] 1 2 3
[[2]]
[1] 4 5
[[3]]
logical(0)
[[4]]
[1] NA 6 7 NA
[[5]]
logical(0)
Run Code Online (Sandbox Code Playgroud)
另一种选择是 discard
library(purrr)
discard(myList, ~ all(is.na(.x)))
#[1]]
#[1] 1 2 3
#[[2]]
#[1] 4 5
#[[3]]
#[1] NA 6 7 NA
Run Code Online (Sandbox Code Playgroud)
Filter
救援:
Filter(function(x) !all(is.na(x)), myList)
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 4 5
#
#[[3]]
#[1] NA 6 7 NA
Run Code Online (Sandbox Code Playgroud)
您可以使用至少一个非 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
Run Code Online (Sandbox Code Playgroud)