行列があるとします。最初の行に column1、2 番目の行に column5、3 番目の行に column4 から値を選択したいとします (...)。列は列名としてベクトルに格納され、このベクトル内の位置は列が選択される行と等しくなります。
これを効率的に、つまりループせずに達成するにはどうすればよいですか?
(背景は次のとおりです。私の目的はこれをシミュレーションで使用することです。そのため、速度を上げるためにベクトル化したいと考えています)
最小限の例:
# Creating my dummy matrix
aMatrix <-matrix(1:15,3,5,dimnames=list(NULL,LETTERS[1:5]))
aMatrix
A B C D E
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15
# Here are the columns I want for each row
columns <-c("A","E","D")
columns
[1] "A" "E" "D"
# means: select for row 1 column "A" = 1,
# select for row 2 column "E" = 11,
# select for row 3 column "D" = 12
# Now obviously I could do looping, but this is inefficient
for (i in columns) print(grep(i,colnames(aMatrix))) #grep is necessary for my specific matrix-names in my simulation only.
[1] 1 #wanting col. 1 for row 1
[1] 5 #wanting col. 5 for row 2
[1] 4 #wanting col. 4 for row 3
私が行った方法でループすることはあまり効率的ではないことがわかりました。
私はsapply/tapplyについて考えていましたが、変更される2つの引数(マトリックスで検索される行と、ターゲットの列名ベクトルから選択される文字)があるため、どういうわけかそれを機能させることができませんでした。
私はあなたの助けに感謝します。ありがとう!
ジャナ
PSここでは「grep」を使用します。これは、実行するシミュレーションで列名が実際の列名の部分文字列であるためです。しかし、その部分文字列を作成すると、例がより複雑になるため、スキップしました。