R 将属性向量转换为元素差异矩阵

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,

与此类似,我需要将属性向量转换为矩阵。这一次使用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, 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