是否可以强制stats包中的距离对象不是0?
在这里,我尝试将其强制为其他东西,我可以改变上部或下部而不是对角线:
set.seed(10)
x <- matrix(rnorm(25), ncol = 5)
y <- dist(x, diag =TRUE)
z <- 1 - as.matrix(y)
as.dist(z, diag =TRUE)
给出:
1 2 3 4 5
1 0.0000000
2 -0.9030066 0.0000000
3 -0.9803571 -1.9319785 0.0000000
4 -1.5249747 -2.3673155 -1.5928891 0.0000000
5 -2.7903980 -2.8020380 -2.2491893 -1.5839067 0.0000000
而非预期:
1 2 3 4 5
1 1.0000000
2 -0.9030066 1.0000000
3 -0.9803571 -1.9319785 1.0000000
4 -1.5249747 -2.3673155 -1.5928891 1.0000000
5 -2.7903980 -2.8020380 -2.2491893 -1.5839067 1.0000000
也许我必须将它作为矩阵对象输出,因为有一些事情迫使对角线不为0,导致它不符合“dist”对象的处理方式。
答案 0 :(得分:6)
不是dist()
;它不存储对角线,只是一个标志,表示是否应该通过print()
方法打印。
这不是意料之中的; dist()
是存储距离矩阵的紧凑方式,而不是一般的对称矩阵。在距离矩阵中,根据定义,观察与自身之间的距离为0.因此dist()
将对角线视为琐碎的东西而不是存储它。
如果我想做你想做的事情,我会使用dist()
的胆量并将数据存储为dist()
,在一个函数中,用mydist()
表示"mydist"
1}},然后写print.mydist()
从print.dist()
方法获取代码,但是使用对角线的另一个值,并写as.matrix.mydist()
来转换为矩阵。你的类可以存储对角线的值(如果它们变化)或只是你希望对角线的单个值。
基本上,您需要做的就是将所需的对角线值存储为额外属性,然后提供从该属性中提取的print()
和as.matrix()
方法进行打印或填充矩阵。
答案 1 :(得分:3)
dist对象不是一个矩阵,虽然有一个强制函数来制作一个(你已经知道了)。如果你想要像dist对象这样的矩阵对象你可以这样做:
> z <- as.matrix(y)
> diag(z) <- 1
> z[upper.tri(z)] <- NA
> z
1 2 3 4 5
1 1.000000 NA NA NA NA
2 2.515850 1.000000 NA NA NA
3 2.093508 2.443131 1.000000 NA NA
4 2.734773 1.985341 2.652412 1.000000 NA
5 1.107235 2.012257 2.134162 1.913537 1