繁体   English   中英

在矩阵中查找 NA 的组合(异或?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM