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

时间:2016-11-23 06:46:03

标签: r dataframe na

我的R数据帧df低于

a   b   c

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

我想删除两个中有NA的行a& 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),]

但这会删除所有NAs(执行OR功能)。我需要在这里做AND操作。

我该怎么做?

6 个答案:

答案 0 :(得分:2)

您可以尝试:

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

答案 1 :(得分:2)

使用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

答案 2 :(得分:1)

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

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

或另一个选项Reduce lapply

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

答案 3 :(得分:1)

另一种方法

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))

答案 4 :(得分:0)

这也有效:

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

答案 5 :(得分:0)

我的想法与其他回复基本相同。

考虑具有包含所有NA的特定行的任何数据集,368的总和将始终为零。所以你只需要取出那一行。

所以你可以这样做:

0