删除NA数据,但在R中具有某些条件



让我们看看示例数据

nad=structure(list(x1 = 1:5, x2 = c(NA, 2L, 2L, NA, 34L), x3 = c(NA, 
1L, NA, NA, NA), x4 = c(NA, 2L, 5L, NA, NA), x5 = c(NA, 3L, NA, 
NA, NA), x6 = c(NA, 4L, NA, NA, NA)), .Names = c("x1", "x2", 
"x3", "x4", "x5", "x6"), class = "data.frame", row.names = c(NA, 
-5L))
x1 x2 x3 x4 x5 x6
1  1 NA NA NA NA NA
2  2  2  1  2  3  4
3  3  2 NA  5 NA NA
4  4 NA NA NA NA NA
5  5 34 NA NA NA NA

平时不用NA就能得到完整的数据,我可以使用这个函数

na.omit(nad)

但我的问题有点复杂。 尽管x2NA,但我不需要删除行,因为x2NA。 有价值的数据是有价值的x1而不是x2, 如果行中有针对x1x2的观测值,但在另一个变量上没有观测值,则不应删除该行。 因此,不应删除第一行和第 4 行。 应该删除 3 和 5,因为这里一方面有关于x1x2的观测值,但其他变量是空白的。 第二行完全完成,我不需要删除它。 如何使用这种情况删除NA? 期望的输出

x1 x2 x3 x4 x5 x6
1  1 NA NA NA NA NA
2  2  2  1  2  3  4
3  4 NA NA NA NA NA

作为补充(单独的问题,但相邻(,我也想在这里问,也许我需要这个进行分析 如果有这种情况

x1 x2 x3 x4 x5 x6
1  1 NA NA NA NA NA
2  2 NA  1  1  1  1

这里第一行有NAx2NA其他变量, 第二行NAx2,但另一个变量不是 NA。 在这种情况下,如何只留下x1有值的行,x2没有值,但另一个变量有值?

所以也许你正在寻找

nad[!is.na(nad$x1) & is.na(nad$x2) | rowSums(!is.na(nad)) == ncol(nad), ]
#  x1 x2 x3 x4 x5 x6
#1  1 NA NA NA NA NA
#2  2  2  1  2  3  4
#4  4 NA NA NA NA NA

这将选择x1具有非 NA 值且x2具有NA或行中的所有值均为非 NA 值的行。

我认为您最好检查每一行是否满足您的条件。如果我理解正确,类似以下内容的内容可能会起作用:

keep <- apply(nad, 1, function(row) {
# Don't keep data if first column is NA
if (!is.na(row[[1]])) {
sumna <- sum(is.na(row[-1]))
# Only keep if rest is all NA or none is NA
if (sumna == 0 | sumna == length(row) - 1) {
return(TRUE)
} else {
return(FALSE)
}
} else {
return(FALSE)
}
})
nad[keep,]
x1 x2 x3 x4 x5 x6
1  1 NA NA NA NA NA
2  2  2  1  2  3  4
4  4 NA NA NA NA NA

最新更新