[英]Finding combination of NAs in matrix (exclusive AND?)
我面临一个我无法完全弄清楚的问题,我希望有人能够帮助我解决这个问题。 它可能超级简单,但我正在挣扎,我花了太多时间来解决这个问题,以至于我无法再清楚地思考了。
我有一个矩阵,假设有 20 行和 5 列。 有时我在第 1 列中有 NA。其他时候在第 1 列和第 2 列,或只有 2 列,或 2 列和 4 列等。
我想获取仅缺少第 1 列中的值的观察结果的行名称。 然后我想寻找组合,例如只缺少第 1 列和第 2 列的组合。
这是一些示例代码:
set.seed(39)
df <- matrix(rnorm(100),nrow=20, ncol = 5)
df <- apply (df, 2, function(x) {x[sample(c(1:20), floor(20/8))] <- NA; x} )
auxmatrix <- is.na(df)
到目前为止,我的方法是这样的:
which(ifelse(auxmatrix[,1] == T, 1, 0) == 1)
这旨在寻找仅缺少第 1 列中的值的观察结果。 但是,这显然也给了我那些缺少第 1 列和(示例)第 2 列的观察结果。
我如何表述它忽略那些缺少 1 和 2 的行的语句?
之后我还想寻找组合,例如:
which(ifelse(auxmatrix[,3] == T & auxmatrix[,4] == T, 1, 0) == 1)
找到第 3 列和第 4 列中有 NA 的观察结果。当然,他的 then 也给了我错误的观察结果,因为可能存在 3,4 和 5 缺失的观察结果。
我希望我能正确表达我的问题。 我非常感谢你的想法。
最好的问候, tony13
我认为只用which
更简单:
对于第 1 列中的行号: which(is.na(df[,1])
对于列的组合: which(is.na(df[,2]) & is.na(df[,3]))
例如,这将返回第 2 列和第 3 列中为NA
的行号。
使用rowSums
。 让我们使用一个更简单的数据框。
df
# V1 V2 V3 V4 V5
# 1 1 1 1 1 1
# 2 1 1 1 NA 1
# 3 NA 1 1 1 1
# 4 1 NA 1 1 1
# 5 NA 1 1 1 1
# 6 NA NA 1 1 1
# 7 NA NA 1 NA 1
# 8 NA NA 1 1 1
# 9 NA NA NA NA NA
现在我们使用rowSums
产生的 boolean 矩阵的is.na
。
## NA only in 1st and 2nd row
which(rowSums(is.na(df[, 1:2])) == 2 & !rowSums(is.na(df[, -(1:2)])))
# [1] 6 8
仅使用一列(即第一列)实际上是一种特殊情况,
## NA only in 1st row
which(rowSums(is.na(df[, 1, drop=FALSE])) & !rowSums(is.na(df[, -1])))
# [1] 3 5
简化为:
## NA only in 1st row
which(is.na(df[, 1]) & !rowSums(is.na(df[, -1])))
# [1] 3 5
数据:
df <- structure(list(V1 = c(1L, 1L, NA, 1L, NA, NA, NA, NA, NA), V2 = c(1L,
1L, 1L, NA, 1L, NA, NA, NA, NA), V3 = c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, NA), V4 = c(1L, NA, 1L, 1L, 1L, 1L, NA, 1L, NA), V5 = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, NA)), class = "data.frame", row.names = c(NA,
-9L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.