1

考虑以下矩阵,

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))

有任何想法吗?

4

2 回答 2

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
)
于 2012-03-07T10:20:25.670 回答
1

This will get you close:

    cols <- col(m)
    cbind(cols[which(is.na(m))-1],cols[is.na(m)])
         [,1] [,2]
    [1,]    2    3
    [2,]    4    5
于 2012-03-07T10:24:16.583 回答