【问题标题】:Look up value in a matrix based on the strings in a dataframe根据数据框中的字符串在矩阵中查找值
【发布时间】:2023-03-04 04:02:01
【问题描述】:

我有一个类似的数据框

 X     Y    VALUE    
"AAA" "BBB"
"CCC" "AAA"

我也有一个矩阵:

     AAA BBB CCC
 AAA  1   13  2
 BBB  27  11  4
 CCC  6   12  3

以 AAA、BBB 和 CCC 作为列名和行名。如何使用矩阵中的值填充数据框中的 VALUE 列?

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以的

    df$VALUE <- mat[cbind(df$X, df$Y)]
    

    使用您的示例:

    df <- data.frame(X = c("AAA", "CCC"),
                     Y = c("BBB", "AAA"), stringsAsFactors = FALSE)
    df
    #     X   Y
    # 1 AAA BBB
    # 2 CCC AAA
    
    mat <- matrix(c(1, 27, 6, 13, 11, 12, 2, 4, 3),
                  nrow = 3, ncol = 3,
                  dim = list(c("AAA", "BBB", "CCC"),
                             c("AAA", "BBB", "CCC")))
    mat
    #     AAA BBB CCC
    # AAA   1  13   2
    # BBB  27  11   4
    # CCC   6  12   3
    
    df$VALUE <- mat[cbind(df$X, df$Y)]
    df
    #     X   Y VALUE
    # 1 AAA BBB    13
    # 2 CCC AAA     6
    

    【讨论】:

    • 你好。谢谢您的回答。出于某种原因,字符串在我的矩阵中存储为行名和列名,直接使用“cbind”对我的矩阵不起作用。我必须使用 mat[cbind(match(m3$X,rownames(mat)),match(m3$Y,colnames(mat)))] 之类的东西才能使其工作。
    • “不起作用”,你的意思是它没有返回预期值(但没有错误)?如果是这样,问题可能来自您的 X 和 Y 列是因素,您可以通过运行 class(m3$X) 来检查。
    • ...在这种情况下,您可以运行一些较短的内容,例如 mat[cbind(as.character(m3$X), as.character(m3$Y))],或者考虑从 data.frame 中删除因子。
    • 谢谢!我认为这是问题所在。
    【解决方案2】:

    你也可以直接用melt从矩阵中获取数据框:

    library(reshape2)
    melt(mat)
    

    【讨论】:

    • 这将是另一个问题的答案。您没有使用 OP 的两个输入之一。
    猜你喜欢
    • 2018-09-27
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2021-11-04
    • 2017-05-06
    相关资源
    最近更新 更多