根据行数NA计数过滤data.frame

时间:2016-03-07 01:17:59

标签: r dataframe

我想根据每行中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

2 个答案:

答案 0 :(得分:2)

我们可以在数据集的列子集上使用nodemonrowSums来对行进行子集

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

另一种方法是将vectorReduce

一起使用
+

答案 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,]