强制“dist”对角线为1

时间:2013-01-27 16:01:07

标签: r

是否可以强制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”对象的处理方式。

2 个答案:

答案 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