我有一个从其他过程中获得的距离向量,并希望将其转换为
dist
语言中的 R
对象。
下面我给出一个例子,这样的向量看起来像:
distVector
的计算方式与其他过程计算距离向量的方式相同。理想情况下,我想将这个向量转换为距离矩阵(dist
对象)而不浪费资源。
我想我可以将其转换为矩阵,将其复制为上三角和下三角矩阵,将对角线设置为 0,并处理与
upside down
对象结构相比,它有点 dist
的事实(比较下面的输出)。话又说回来,首先创建一个完整的矩阵,然后(可能?)再次将其减少为 dist
对象中的向量对我来说似乎很浪费。有更好的办法吗?
示例代码(注意:我无法更改
distVector
的计算方式):
rawData<-matrix(c(1,1,1,1.1,1,1,1,1,1.2,2,2,2,2.2,2,2,2,2.2,2.2,3,3,3,3.4,3,3),ncol=3,byrow=TRUE);
distVector<-integer(0);
for(i in 1:dim(rawData)[1]) {
for(j in (i+1):dim(rawData)[1]) {
a <- (rawData[i,]-rawData[j,]);
distVector <- c(distVector, sqrt(a %*% a));
}
}
print(distVector)
print(dist(rawData))
输出:将
distVector
与dist
函数的输出进行比较,它是颠倒的)
> print(distVector)
[1] 0.1000000 0.2000000 1.7320508 1.8547237 1.9697716 3.4641016 3.7094474 0.2236068 1.6763055
[10] 1.7916473 1.9209373 3.4073450 3.6455452 1.6248077 1.7549929 1.8547237 3.3526109 3.6055513
[19] 0.2000000 0.2828427 1.7320508 1.9899749 0.3464102 1.6248077 1.8547237 1.5099669 1.8000000
[28] 0.4000000
> print(dist(rawData))
1 2 3 4 5 6 7
2 0.1000000
3 0.2000000 0.2236068
4 1.7320508 1.6763055 1.6248077
5 1.8547237 1.7916473 1.7549929 0.2000000
6 1.9697716 1.9209373 1.8547237 0.2828427 0.3464102
7 3.4641016 3.4073450 3.3526109 1.7320508 1.6248077 1.5099669
8 3.7094474 3.6455452 3.6055513 1.9899749 1.8547237 1.8000000 0.4000000
非常感谢, 托马斯。
您可以将类设置为
dist
,但您还需要将Size
属性设置为全距离矩阵中的行数:
> v=4:9;class(v)="dist";attr(v,"Size")=ceiling(sqrt(length(v)*2));v
1 2 3
2 4
3 5 7
4 6 8 9
使用以下内容:
structure(x, class = 'dist',
Size = Re(polyroot(c(-2*length(x),-1,1))[1]))
x
是你的distVector