如何从像这样的数据帧(原始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本身不会给出正确的对称矩阵,也许有一种有效的方法可以做到。
答案 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