最简单的方法就是将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