如果 NA 存在则省略整个列表

Omitting the whole list if NA present

假设我有一个列表列表:

d <- list(matrix(c(1:6),nrow=3,ncol=2),matrix(c(7:12),nrow=3,ncol=2))
e <- list(matrix(c(1:6),nrow=3,ncol=2),matrix(c(7:9,NA,NA,12),nrow=3,ncol=2))
f <- list(d,e)
rapply(f, na.omit, how = "replace")

当我使用此 rapply 函数时,它只会删除其中包含 NA 的行。如果在那里找到任何 NA,我希望删除整个列表。我的意思是,既然列表 e 中有 NA,那么我希望列表 e 完全从列表 f 中消失。我该怎么做?

PS。我正在使用的真实数据与我在此处复制的数据略有不同。这是一个包含 550 多个列表的长列表,每个列表都是 8 x 6 个数据帧。这是它的外观快照。我不确定我在这里复制的答案是否与我的真实数据相同,但让我们试一试! (在真实数据中,部分Bid Yield值是NA的)

PS2。如果您认为答案不同,我可以通过 google 驱动器共享数据。

任何帮助将不胜感激!

您可以使用 Filter :

Filter(function(x) all(!is.na(unlist(x))), f)

[[1]]
#[[1]][[1]]
#     [,1] [,2]
#[1,]    1    4
#[2,]    2    5
#[3,]    3    6

#[[1]][[2]]
#     [,1] [,2]
#[1,]    7   10
#[2,]    8   11
#[3,]    9   12

这是使用应用函数的基础 R 方法:

ind <- sapply(f, function(x) sum(sapply(x, function(y) sum(is.na(y)))) == 0)
f[ind]

[[1]]
[[1]][[1]]
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

[[1]][[2]]
     [,1] [,2]
[1,]    7   10
[2,]    8   11
[3,]    9   12

请注意,e 矩阵列表已完全删除,因为该列表的其中一个矩阵中有一个 NA 值。

数据:

d <- list(matrix(c(1:6),nrow=3,ncol=2), matrix(c(7:12), nrow=3, ncol=2))
e <- list(matrix(c(1:6),nrow=3,ncol=2), matrix(c(7:9,NA,NA,12), nrow=3, ncol=2))
f <- list(d, e)