裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

行列の各行から指定した要素を取り出す

2014年09月04日 | ブログラミング

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

が素直かな。

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 覆面算 | トップ | 2 個の時系列データの相関を... »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (Unknown)
2014-09-04 23:32:57
行順ではなくなりますが
x[outer(y, 1:3, "==")]
はどうでしょうか。
返信する

コメントを投稿

ブログラミング」カテゴリの最新記事