3

行列があるとします。最初の行に 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」を使用します。これは、実行するシミュレーションで列名が実際の列名の部分文字列であるためです。しかし、その部分文字列を作成すると、例がより複雑になるため、スキップしました。

4

1 に答える 1

5

ヘルプ ページ?`[`にあるように、マトリックスでサブセット化して個々の要素を取得できます。サブセット化行列の各行は要素であり、列は各次元のインデックスを指定します。

match(columns,colnames(aMatrix)) #gets the column indices
# [1] 1 5 4
b <- cbind(seq_along(columns),match(columns,colnames(aMatrix))) #subset matrix
#      [,1] [,2]
# [1,]    1    1 #first element: first row first column
# [2,]    2    5 #second element: second row fifth column
# [3,]    3    4 #third element: third row fourth column
aMatrix[b]
# [1]  1 14 12
于 2013-02-07T16:31:04.770 に答える