【问题标题】:Generate symmetric matrix using variable pairs from data.frame使用 data.frame 中的变量对生成对称矩阵
【发布时间】:2014-09-03 18:02:47
【问题描述】:

如何从这样的数据框有效地生成对角线为 1 的对称矩阵(原始 df 有约 12000 个变量组合):

mydata <- data.frame(Var1 = c("A", "A", "B"), Var2 = c("B", "C", "C"), values = c(2, 3, 6))

Var1 Var2 values
1    A    B      2
2    A    C      3
3    B    C      6

我想要以下输出:

mymatrix <- matrix(c(1,2,3,2,1,6,3,6,1), ncol = 3, dimnames = list(c("A", "B", "C"), c("A", "B", "C")))


  A B C
A 1 2 3
B 2 1 6
C 3 6 1

dcast 本身不会给出适当的对称矩阵,也许有一种有效的方法来做到这一点。

【问题讨论】:

    标签: r matrix reshape


    【解决方案1】:

    最简单的方法就是将upper.tri 复制到lower.tri。例如

    #create new matrix
    vals<-sort(unique(c(as.character(mydata$Var1), as.character(mydata$Var2))))
    nm<-matrix(NA, nrow=length(vals), ncol=length(vals), dimnames=list(vals, vals))
    diag(nm)<-1
    
    #fill
    nm[as.matrix(mydata[, 1:2])] <- mydata[,3]
    
    #symmetric
    nm[lower.tri(nm)] <- nm[upper.tri(nm)]
    nm
    
    #   A B C
    # A 1 2 3
    # B 2 1 6
    # C 3 6 1
    

    当然,这假设您要填写的所有值都在矩阵的上三角形开头

    或者,你可以双填

    nm <- matrix(NA, nrow=length(vals), ncol=length(vals), dimnames=list(vals, vals))
    diag(nm) <- 1    
    
    #fill
    nm[as.matrix(mydata[, 1:2])] <- mydata[,3]
    #fill reversed
    nm[as.matrix(mydata[, 2:1])] <- mydata[,3]
    nm
    
    #   A B C
    # A 1 2 3
    # B 2 1 6
    # C 3 6 1
    

    它不假设矩阵的填充顺序。

    最后,您可以使用转置 coalesce(如果您不介意使用非基础辅助函数)

    nm<-matrix(NA, nrow=length(vals), ncol=length(vals), dimnames=list(vals, vals))
    diag(nm)<-1
    
    #fill
    nm[as.matrix(mydata[, 1:2])] <- mydata[,3]
    #coalesce
    nm<-coalesce(nm, t(nm))
    nm
    
    #   A B C
    # A 1 2 3
    # B 2 1 6
    # C 3 6 1
    

    【讨论】:

    • 谢谢,第一个解决方案已经很完美了。完全忘记了我可以用另一个 2 col 矩阵子集一个矩阵。
    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多