如何从两列中有NA的R数据框中删除行(两列中的NA不是一个)?

问题描述:

我具有低于如何从两列中有NA的R数据框中删除行(两列中的NA不是一个)?

a b c 

1 6 NA 
2 NA 4 
3 7 NA 
NA 8 1 
4 9 10 
NA NA 7 
5 10 8 

一个R数据帧DF我想删除具有NA在行BOTH一个& b

我的期望的输出将是

a b c 

1 6 NA 
2 NA 4 
3 7 NA 
NA 8 1 
4 9 10 
5 10 8 

我试图东西像下面这样

df1<-df[(is.na(df$a)==FALSE & is.na(df$b)==FALSE),] 

,但这会删除所有的NA(执行OR功能)。我需要在这里做和操作。

我该怎么做?

+2

这样如何'其中(rowSums(DF,na.rm = T)> 0)'。 –

+0

df [rowSums(is.na(df [,1:2]))== 2,] –

我们可以在逻辑矩阵(is.na(df1))上使用rowSums并将其转换为逻辑向量(rowSums(...) < ncol(df1))以对行进行子集。

df1[rowSums(is.na(df1)) < ncol(df1),] 

或者另一种选择是Reducelapply

df1[!Reduce(`&`, lapply(df1, is.na)),] 

另一种方法

df[!apply(is.na(df),1,all),] 
# a b 
#1 1 6 
#2 2 NA 
#3 3 7 
#4 NA 8 
#5 4 9 
#7 5 10 

数据

df <- structure(list(a = c(1L, 2L, 3L, NA, 4L, NA, 5L), b = c(6L, NA, 
7L, 8L, 9L, NA, 10L)), .Names = c("a", "b"), class = "data.frame", row.names = c(NA, 
-7L)) 

这也将工作:

df[apply(df, 1, function(x) sum(is.na(x)) != ncol(df)),] 

    a b 
1 1 6 
2 2 NA 
3 3 7 
4 NA 8 
5 4 9 
7 5 10 

你可以试试:

df1<-df[!(is.na(df$a) & is.na(df$b)), ] 

我的想法是基本上与其他的答复相同。

考虑到具有所有NA的特定行的任何数据集,总和!is.na(ROW)将始终为零。所以你只需要拿出那一行。

所以,你可以这样做:

df1 = df[-which(rowSums(!is.na(df))==0),] 

使用rowSums

df[!rowSums(is.na(df))==2,] 

通过保存字符更好的[1]

df[rowSums(is.na(df))!=2,] 

输出:

a b 
1 1 6 
2 2 NA 
3 3 7 
4 NA 8 
5 4 9 
7 5 10 

可使用ncol

df[!rowSums(is.na(df))==ncol(df),] 

[1]币一概而论:alistaire

+1

您可以保存一个字符,只需使用'!=' – alistaire