非NA细胞在基质中的位置

时间:2012-03-07 10:04:54

标签: r na

考虑以下矩阵,

m <- matrix(letters[c(1,2,NA,3,NA,4,5,6,7,8)], 2, byrow=TRUE)
##      [,1] [,2] [,3] [,4] [,5]
## [1,] "a"  "b"  NA   "c"  NA  
## [2,] "d"  "e"  "f"  "g"  "h" 

我希望获得与所有非NA元素相对应的列索引,并紧跟以下NA元素合并:

result <- c(list(1), list(2:3), list(4,5), 
                   list(1), list(2), list(3), list(4), list(5))

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

可以使用

获得非NA元素的列(和行)指示
which(!is.na(m), TRUE)

完整答案:

由于你想逐行工作,但R按列处理向量,因此更容易处理m的转置。

t_m <- t(m)
n_cols <- ncol(m)

我们得到如上所述的数组指示,它给出了每个列表的起点。

ind_non_na <- which(!is.na(t_m), TRUE)

由于我们正在进行转置,我们需要行索引,我们需要分别处理每一列。

start_points <- split(ind_non_na[, 1], ind_non_na[, 2])

每个列表的长度由起始点之间的差异或最后一个点与行尾(+1)之间的差异给出。然后我们只需调用seq来获取序列。

unlist(
  lapply(
    start_points, 
    function(x)
    {
      len <- c(diff(x), n_cols - x[length(x)] + 1L)
      mapply(seq, x, length.out = len, SIMPLIFY = FALSE)
    }
  ), 
  recursive = FALSE
)

答案 1 :(得分:1)

这会让你走近:

    cols <- col(m)
    cbind(cols[which(is.na(m))-1],cols[is.na(m)])
         [,1] [,2]
    [1,]    2    3
    [2,]    4    5