【问题标题】:Using matrix as a lookup table in R在 R 中使用矩阵作为查找表
【发布时间】:2021-11-22 12:49:35
【问题描述】:

假设我有一个矩阵:

> mat1
  A B
A 1 3
B 2 4

还有一个数据框:

> df
  First Second
1    A    A
2    A    B
3    B    A
4    B    B

如何在矩阵中查找FirstSecond 的值?

在这种情况下我想要的输出是:

> df
  First Second result
1    A    A      1
2    A    B      3
3    B    A      2
4    B    B      4

我发现我可以做到df <- cbind(df, result = diag(mat1[df$First, df$Second])),但是没有diag() 有没有办法做到这一点?我想如果我有一个很长的数据框,那么mat1[df$First, df$Second] 会在生成更大的矩阵时让代码运行得更慢。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以直接通过mat1 执行此操作

    as.data.frame(as.table(mat1))
    

    -输出

      Var1 Var2 Freq
    1    A    A    1
    2    B    A    2
    3    A    B    3
    4    B    B    4
    

    或转换为matrix

    df$result <- mat1[do.call(cbind, df)]
    

    或使用cbind

    df$result <- mat1[cbind(df$First, df$Second)]
    

    -输出

    > df
      First Second result
    1     A      A      1
    2     A      B      3
    3     B      A      2
    4     B      B      4
    

    或使用simplify2array

    df$result <- mat1[simplify2array(df)]
    

    数据

    mat1 <- structure(1:4, .Dim = c(2L, 2L), .Dimnames = list(c("A", "B"), 
        c("A", "B")))
    df <- structure(list(First = c("A", "A", "B", "B"), Second = c("A", 
    "B", "A", "B")), class = "data.frame", row.names = c("1", "2", 
    "3", "4"))
    
    

    【讨论】:

      【解决方案2】:

      替代方案:

      df$result <- mat1[as.matrix(df)]
      df
      #   First Second result
      # 1     A      A      1
      # 2     A      B      3
      # 3     B      A      2
      # 4     B      B      4
      

      如果df 有更多列,您需要明确地对它们进行子集化,如

      mat1[as.matrix(df[c("First","Second")])]
      # [1] 1 3 2 4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多