2016-03-07 118 views
0

我想根据每行中NA的数量过滤data.frame根据行向NA计数过滤数据帧

如果我开始与以下,

> 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列有2或更多NA的除去行A,B和C,以产生:

A B C E 
1 2 2 6 7 
2 4 9 NA 10 
4 9 7 1 8 

回答

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 s:

na_count <- countNA(df_noE) 

现在过滤原始data.frame这个数:

df[na_count < 2,] 

在单行一起:

df[countNA(subset(df, select=-E)) < 2,] 
+0

谢谢Saladi!为了澄清,如果我想扩展到在我的数据框列表中的每个数据框上执行,我会用我的df [i]替换df吗? –

+0

如果'df'实际上是一个数据框的列表,我想你会想'df [[i]]' –

+0

非常感谢@saladi - 我在这里发布了我的新问题http://stackoverflow.com/问题/ 35835597/in-r-use-a-function-apply-lapply-that-is-working-over-a-list-of-dat –

2

我们可以对数据集中的列子集使用rowSumsis.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 

d[1:3]仅选择'A,B,C'列的数据集。应用is.na将其转换为TRUE/FALSE的逻辑矩阵,在rowSums的每一行中执行TRUE值的sum,最后检查该数字是否小于2以获得我们用于子集化行的逻辑vector


另一种方法是使用Reduce+

d[Reduce(`+`,lapply(d[1:3], is.na)) <2,] 
+1

这是一个更好的答案 –