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

これはあなたを近づけるでしょう:

    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 に答える