如何从两列中有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功能)。我需要在这里做和操作。
我该怎么做?
答
我们可以在逻辑矩阵(is.na(df1)
)上使用rowSums
并将其转换为逻辑向量(rowSums(...) < ncol(df1)
)以对行进行子集。
df1[rowSums(is.na(df1)) < ncol(df1),]
或者另一种选择是Reduce
与lapply
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,na.rm = T)> 0)'。 –
df [rowSums(is.na(df [,1:2]))== 2,] –