【问题标题】:Build matrix with applied formula in R使用 R 中的应用公式构建矩阵
【发布时间】:2021-01-15 13:33:09
【问题描述】:

我在从数据表的矩阵中实现公式时遇到问题。 例如我有这个数据表

Lines <- "vars val1  val2
m     2    1
n     3    1
o     4    2"
DF <- read.table(text = Lines, header = TRUE)

vars val1  val2
 m     2    1
 n     3    1
 o     4    2

我想在矩阵中实现公式,例如 (m1-m2)+(m1-m2),(m1-m2)+(n1-n2),(m1-m2)+(o1-o2) , 等等。 所以,矩阵应该是这样的

       m           n           o 
m (2-1)+(2-1) (2-1)+(3-1) (2-1)+(4-2)
n (3-1)+(2-1) (3-1)+(3-1) (3-1)+(4-2)
o (4-2)+(2-1) (4-2)+(3-1) (4-2)+(4-2)

最终的结果是

    m  n  o
 m  2  3  3
 n  3  4  4
 o  3  4  4

可以使用 dcast 功能来完成吗? 如果不是这样,任何解决方案都将被接受。 提前致谢。

【问题讨论】:

    标签: r matrix datatable


    【解决方案1】:

    目前尚不清楚您拥有什么或您想要什么形式,因为问题不同地涉及 data.table 和矩阵,并且输入和输出没有重复显示(这是发布问题的要求 - 请参阅信息在 标签页的顶部);但是,假设输入是数据框 DF 在最后的注释中可重现地显示,取两个 val* 列的差异并添加给出命名向量 dif 的名称,然后取所示的外部总和:

    dif <- with(DF, setNames(val1 - val2, vars))
    outer(dif, dif, "+")
    

    给出这个矩阵(如果你不想要一个矩阵,可以转换成你想要的任何形式):

      m n o
    m 2 3 3
    n 3 4 4
    o 3 4 4
    

    注意

    Lines <- "vars val1  val2
     m     2    1
     n     3    1
     o     4    2"
    DF <- read.table(text = Lines, header = TRUE)
    

    【讨论】:

    • 非常感谢..这正是我要找的..抱歉我的问题不太清楚..我正在尝试编辑它..
    • 对不起先生,我可以再问一次吗?如果我有另一个像 link 这样的公式怎么办?我尝试在外部使用函数,例如 function(a,b){((a+a)+(b+b))} 其中 a = DF$val1 和 b=DF$val2 但结果矩阵不正确,例如 link
    • 将`dif`定义中的减号改为加号。
    • 对不起,但它不会改变计算顺序 bcs 这是与以前不同的顺序.. 我的意思是公式会像 (val1 in row1 + val1 in row1) + (val2 in row1 + val2 in row1), (val1 in row1 + val1 in row2) + (val1 in row1 + val1 in row2),等等..这是完整的矩阵公式link
    • 您的链接显示了一个反向对角线为 6、c(7, 7)、c(9, 8, 9)、c(10, 10)、12 的输出,如果您将 - 替换为 + 。
    【解决方案2】:

    类似于@G. Grothendieck's answer,我们可以使用outer + dimnames&lt;-

    with(
      df,
      `dimnames<-`(outer(val1 - val2, val1 - val2, "+"), rep(list(vars), 2))
    )
    

    给了

      m n o
    m 2 3 3
    n 3 4 4
    o 3 4 4
    

    数据

    > dput(df)
    structure(list(vars = c("m", "n", "o"), val1 = 2:4, val2 = c(1L, 
    1L, 2L)), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      猜你喜欢
      • 2012-09-17
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多