k × m 行列 x と,k 個の要素を持つベクトル y がある。
> (x = matrix(1:12, 4))
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> y = c(1, 2, 3, 2)
x の各行 x[i,] から,y[i] 番目の要素を取り出す,簡単な方法としてはどんなのがあるか?
> apply(cbind(y, x), 1, function(z) z[z[1]+1])
[1] 1 6 11 8
追記:
このブログは,コメントは「コメント」をクリックしないと見えないので不便なので,記事中に再録する。
追記しようとここに来たところ,x[outer(y, 1:3, "==")] というのはどうかとコメントをもらっていた。
> x[outer(y, 1:3, "==")]
[1] 1 6 8 11
しかし,コメンテーターご自身もおっしゃっているように,行順でないとちょっと,困る。
うまくない理由は,R の行列が byrow=FALSE で要素が並んでいるからなので,以下のようにすればよいということになる。
> t(t(x)[outer(1:ncol(x), y, "==")])
[,1] [,2] [,3] [,4]
[1,] 1 6 11 8
そうそう,ここにきたのは,目覚めの直前に別解がひらめいたので,追記をしにきたのだった。
> x[cbind(1:nrow(x), y)]
[1] 1 6 11 8
が素直かな。
x[outer(y, 1:3, "==")]
はどうでしょうか。