使用data.frame中的变量对生成对称矩阵

时间:2014-09-03 18:02:48

标签: r matrix reshape

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

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本身不会给出正确的对称矩阵,也许有一种有效的方法可以做到。

1 个答案:

答案 0 :(得分:0)

将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