我想获得一个索引,该索引引用矩阵中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值。
答案 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)