我有这样一个列表:
df1 <- data.frame(a=c(NA, NA, 1:10), b=c(NA, 1:11))
df2 <- data.frame(a=1:10, b=c(NA,1:9))
mylist <- list(df1, df2)
> mylist
[[1]]
a b
1 NA NA
2 NA 1
3 1 2
4 2 3
5 3 4
6 4 5
7 5 6
8 6 7
9 7 8
10 8 9
11 9 10
12 10 11
[[2]]
a b
1 1 NA
2 2 1
3 3 2
4 4 3
5 5 4
6 6 5
7 7 6
8 8 7
9 9 8
10 10 9
我想在每个数据帧的一行中删除所有超过1 NA的行。我该怎么做呢?
我发现如何删除行
lapply(mylist, `[`, -1,)
和如何计算NAs的和
NAsums <- function(x) {rowSums(is.na(x))}
lapply(mylist, NAsums)
但是我不知道如何把这两步结合起来。
我们通过list
(lapply
)循环,使用rowSums
获得每行中NA元素的数量,转换为逻辑向量(<2
),并使用它来子集行。
lapply(mylist, function(x) x[rowSums(is.na(x))<2,])
#[[1]]
# a b
#2 NA 1
#3 1 2
#4 2 3
#5 3 4
#6 4 5
#7 5 6
#8 6 7
#9 7 8
#10 8 9
#11 9 10
#12 10 11
#[[2]]
# a b
#1 1 NA
#2 2 1
#3 3 2
#4 4 3
#5 5 4
#6 6 5
#7 7 6
#8 8 7
#9 9 8
#10 10 9