R 仅在“中获取NAs的位置”;“中”;矩阵列的

R 仅在“中获取NAs的位置”;“中”;矩阵列的,r,R,我想得到一个索引,它指的是矩阵中NA值的位置,如果给定单元格为NA,并且列中前后至少有一个非NA值,则该索引为真。例如,给定以下矩阵 [,1] [,2] [,3] [,4] [1,] NA 1 NA 1 [2,] 1 NA NA 2 [3,] NA 2 NA 3 唯一返回TRUE的索引值应该是[2,2] 我想做什么有一个简洁的表达吗?如果必须的话,我可以在各个列中循环使用min(即(!is.na(x[,I]))来查找每个列中

我想得到一个索引,它指的是矩阵中NA值的位置,如果给定单元格为NA,并且列中前后至少有一个非NA值,则该索引为真。例如,给定以下矩阵

     [,1] [,2] [,3] [,4]
[1,]   NA    1   NA    1
[2,]    1   NA   NA    2
[3,]   NA    2   NA    3
唯一返回TRUE的索引值应该是[2,2]

我想做什么有一个简洁的表达吗?如果必须的话,我可以在各个列中循环使用
min(即(!is.na(x[,I]))
来查找每个列中的第一个非na值,然后将该列之前的所有值设置为FALSE(对于max之后的所有值都相同)。这样我就不会选择前导和尾随NA值。但这似乎有点混乱,所以我想知道是否有一个更干净的表达式可以不使用循环来实现这一点


编辑若要有效,NA值只需在列中的某个位置前后有一个非NA值,但不一定与之相邻。例如,如果一个列由c(NA,3,NA,NA,NA,4,NA)定义,那么我想要找到的NA将是位置3,4和5处的NA,因为它们被非NA值所包围。

还没有对此进行彻底的测试,但它确实适用于测试用例:

z <- matrix(c(NA,1,NA,1,NA,2,NA,NA,NA,1,2,3),ncol=4)
isNA <- is.na(z)
# Vertical index which increments at non-NA entries, counting top-to-bottom:
nonNA_idx.tb <- apply(!isNA, 2, cumsum)
# Vertical index which increments at non-NA entries, counting bottom-to-top:
nonNA_idx.bt <- apply(!isNA, 2, function(x) { rev(cumsum(rev(x))) })
which(isNA & nonNA_idx.tb>0 & nonNA_idx.bt>0, arr.ind=TRUE)

z
mpts[2,3]也不应返回?daroczig-不,因为列中前后没有非NA值。谢谢,我应该仔细阅读您的问题。我试着根据你的详细信息来编一个矢量化的答案,我希望它能对你有用。你的答案和我的答案是互补的,我认为(对问题的不同解释)事实上,仔细阅读,我认为我弄错了,因为我的版本返回的不止[2,2]。将最后一行中的
|
更改为
&
,它只返回[2,2],但我认为他正在寻找一个累积NA计数。然而,这是一个有用的问题,因为我以前从未掌握如何在不使用for循环的情况下引用附近的行和列。很抱歉,我指的是一个NA,它在列中的某个位置之前或之后有一个非NA值,但不一定与它相邻。例如,如果有输入矩阵(c(NA,1,NA,NA,1,NA,NA,NA,2,NA,NA,NA,NA,1,2,3,4),ncol=4),则只需返回[2,2]和[2,3]。尽管如此,您的代码确实为处理NAs的相关问题提供了一种有趣的方法,其中必须有一个相邻的非NA值。x1是一个索引序列,在非NA条目处递增,从上到下计数。x2是相同的,向后计数(从下到上)。它们仅在顶部和底部由非NA包围的内部条目处均为非零,因此它们在两个方向上计数的非NA索引均>0。最后,使用a&筛选出内部NAs。你能把x1,x2更名为更直观吗?nonNA_idx.tb,nonNA_idx.bt也许?@smci,如果你有必要的声誉(看起来你有--2K),请随意编辑。。。
m <- matrix(c(NA, 1, NA, 1, NA, 2, NA, NA, NA, 1, 2, 3), ncol= 4)

matmain <- is.na(m)
matprev <- rbind(FALSE, head(!matmain, -1))
matnext <- rbind(tail(!matmain, -1), FALSE)

which(matmain & (matprev | matnext), arr.ind = TRUE)
m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4)