R 将属性向量转换为元素差异矩阵
与此类似,我需要将属性向量转换为矩阵。这一次使用R表示元素对之间的差异 例如,我有一个向量,它报告了N个人的年龄(从18岁到90岁)。我需要将这个向量转换成一个名为a的NxN矩阵(行和列上都有人名),其中每个单元格Aij的值为| age_I-age_j |,表示两个人I和j之间年龄的绝对差异 这是一个有3个人的例子,第一个18岁,第二个23岁,第三个60岁,产生这个向量:R 将属性向量转换为元素差异矩阵,r,matrix,vector,similarity,sna,R,Matrix,Vector,Similarity,Sna,与此类似,我需要将属性向量转换为矩阵。这一次使用R表示元素对之间的差异 例如,我有一个向量,它报告了N个人的年龄(从18岁到90岁)。我需要将这个向量转换成一个名为a的NxN矩阵(行和列上都有人名),其中每个单元格Aij的值为| age_I-age_j |,表示两个人I和j之间年龄的绝对差异 这是一个有3个人的例子,第一个18岁,第二个23岁,第三个60岁,产生这个向量: c(18, 23, 60) 我想把它转换成这个矩阵: A = matrix( c(0, 5, 42, 5, 0, 37,
c(18, 23, 60)
我想把它转换成这个矩阵:
A = matrix( c(0, 5, 42, 5, 0, 37, 42, 37, 0), nrow=3, ncol=3, byrow = TRUE)
请注意,dist
函数返回一个“dist”对象,因此您可能希望将其强制为带有as.matrix
的矩阵。然后可以删除参数:
dist(tmp, upper=TRUE, diag=TRUE)
1 2 3
1 0 5 42
2 5 0 37
3 42 37 0
as.matrix(dist(tmp))
1 2 3
1 0 5 42
2 5 0 37
3 42 37 0
或者再次使用外部
。输入减法运算符,然后取绝对值
abs(outer(tmp, tmp, "-"))
[,1] [,2] [,3]
[1,] 0 5 42
[2,] 5 0 37
[3,] 42 37 0
据推测,
dist
将比outer
更快,因为该算法可以利用这种计算中存在的对称性,而outer
则更一般。我还想知道是否有一种简单的方法可以做相反的事情:将距离矩阵转换为属性数组。外线有反向指令吗?我脑子里想不出什么。这可能值得单独问一个问题。如果这样做,请确保包含一个可复制的示例。
abs(outer(tmp, tmp, "-"))
[,1] [,2] [,3]
[1,] 0 5 42
[2,] 5 0 37
[3,] 42 37 0