【问题标题】:Select a column by column-name, but a different name for each row of a matrix in R?按列名选择一列,但R中矩阵的每一行的名称不同?
【发布时间】:2013-02-07 16:23:11
【问题描述】:

假设我有一个矩阵,我想从 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 但不知何故无法让它工作,因为有两个参数发生了变化(要在矩阵中搜索的行,以及要从目标列名向量中选择的字母)。

非常感谢您的帮助。 谢谢!

贾娜

附:我在这里使用“grep”,因为列名是我将运行的模拟中实际列名的子字符串。但是创建子字符串会使示例变得更加复杂,因此我跳过了它。

【问题讨论】:

    标签: r


    【解决方案1】:

    正如帮助页面?`[` 所说,您可以使用矩阵进行子集化以获取单个元素。子集矩阵的每一行都是一个元素,列指定每个维度的索引。

    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
    

    【讨论】:

    • 谢谢,我总是忘记 seq_along 我才意识到我的问题不是 100% 清楚,我会立即更新。
    • @JBJ :看起来这当然是对所提出问题的答案。您需要构造一个需要grep 的示例。目前没有。
    • @DWin:感谢您的提示(正如我(明确)在文本中注意到的那样,grep 仅用于我的内部待运行模拟,不影响实际问题,这是为什么没有必要通过在这里构建一个 grep 示例来使其复杂化)。我刚试了答案,马上就接受了刚才的完美答案。在我接受它作为答案之前,请允许我有时间尝试解决方案。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多