按列名选择列,但R中矩阵的每一行都有不同的名称?

时间:2013-02-07 16:23:11

标签: r

假设我有一个矩阵,我想从column1为第一行选择值,column5为第二行选择值,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,但不知何故无法使用,因为有两个参数发生了变化(要在矩阵中搜索的行,以及要从目标columnname-vector中选择的字母)。

我会非常感谢你的帮助。 谢谢!

亚娜

P.S。我在这里使用“grep”,因为列名是我将运行的模拟中实际列名的子串。但是,子串创建会使示例更复杂,因此我跳过它。

1 个答案:

答案 0 :(得分: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