我想根据每行中NA的数量来过滤data.frame
。
如果我从以下开始,
> d
A B C E
1 2 2 6 7
2 4 9 NA 10
3 6 NA NA 4
4 9 7 1 8
我想过滤d
以删除A,B和C列中包含2个或更多NA的行,以产生:
A B C E
1 2 2 6 7
2 4 9 NA 10
4 9 7 1 8
答案 0 :(得分:2)
我们可以在数据集的列子集上使用nodemon
和rowSums
来对行进行子集
is.na
d[rowSums(is.na(d[1:3]))<2,]
# A B C E
#1 2 2 6 7
#2 4 9 NA 10
#4 9 7 1 8
选择仅包含“A,B,C”列的数据集。应用d[1:3]
将其转换为is.na
的逻辑矩阵,使用TRUE/FALSE
执行每行中TRUE值的sum
,最后检查该数字是否小于2获得我们用于对行进行子集化的逻辑rowSums
。
另一种方法是将vector
与Reduce
+
答案 1 :(得分:0)
为了重现性,请在下面定义data.frame
,每行NA
个不同的数量。
df <- data.frame(
A = c(1, 2, 3, NA),
B = c(1, 2, NA, NA),
C = c(1, NA, NA, NA),
E = c(5, 6, 7, 8)
)
定义一个函数,该函数计算给定行中NA
的数字:
countNA <- function(df) apply(df, MARGIN = 1, FUN = function(x) length(x[is.na(x)]))
根据问题的措辞,从此计算中排除列E
:
df_noE <- subset(df, select=-E)
现在使用上面的函数在每行中计算NA
:
na_count <- countNA(df_noE)
现在使用此计数过滤原始data.frame
:
df[na_count < 2,]
一起排在一行:
df[countNA(subset(df, select=-E)) < 2,]