我的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操作。
我该怎么做?
答案 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