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

时间:2011-01-28 21:38:36

标签: 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(which(!is.na(x[,i])))的内容来查找每列中的第一个非NA值,然后将之前的所有值设置为FALSE(对于max之后的所有值都相同) 。这样我就不会选择前导和尾随NA值。但这看起来有点混乱,所以我想知道是否有一个更清晰的表达式,没有循环这样做。

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

3 个答案:

答案 0 :(得分:6)

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

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)

(PS - 我觉得它很可爱,但我有偏见)

答案 1 :(得分:1)

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)

我对这个问题的解释略有不同。当你在专栏前后说,你的意思是前后,或之前和之后的任何地方?使用以下测试矩阵,我们有[2,1] [3,1]和[2,2],但是[2,3]呢?

m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4)

答案 2 :(得分:0)

pts&lt; - 样本(c(1:10,NA),size = 100,replace = T)

mat&lt; - matrix(pts,ncol = 10)

(is.na(mat),arr.ind = T)