让我们看看示例数据
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)
但我的问题有点复杂。 尽管x2
NA
,但我不需要删除行,因为x2
NA
。 有价值的数据是有价值的x1
而不是x2
, 如果行中有针对x1
和x2
的观测值,但在另一个变量上没有观测值,则不应删除该行。 因此,不应删除第一行和第 4 行。 应该删除 3 和 5,因为这里一方面有关于x1
和x2
的观测值,但其他变量是空白的。 第二行完全完成,我不需要删除它。 如何使用这种情况删除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
这里第一行有NA
x2
,NA
其他变量, 第二行NA
x2
,但另一个变量不是 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