Матрица на разстоянието със знак в R

[Забележете, че написах този въпрос, след което намерих отговор. Мислех, че може би някой друг би искал да го знае, така че публикувам отговора за всеки случай. Не съм сигурен дали това е „свършеното“].

Да предположим, че искам матрицата на разстоянието със знак на вектор, т.е. разстоянията не винаги са положителни, но могат да бъдат отрицателни. Не можете да използвате

dist()

защото връща абсолютни стойности.


person Daniel Egan    schedule 19.02.2013    source източник


Отговори (2)


Ето друг подход, който е много по-бърз и изисква по-малко памет:

y <- sample (1 : 4)
distmat <- outer (y, y, `-`) 

добиви:

> distmat
     [,1] [,2] [,3] [,4]  
[1,]    0    1    3    2  
[2,]   -1    0    2    1  
[3,]   -3   -2    0   -1  
[4,]   -2   -1    1    0

## not sure why you want the upper triangular NA
distmat[upper.tri(distmat,diag=TRUE)]<-NA

но може би искате:

> as.dist (distmat)
   1  2  3
2 -1      
3 -3 -2   
4 -2 -1  1
person cbeleites unhappy with SX    schedule 19.02.2013

Използвайте приложи:

y<-seq(1:10)
distmat<-as.data.frame(apply(as.matrix(y),1,function(x) y-x))
distmat[upper.tri(distmat,diag=TRUE)]<-NA
person Daniel Egan    schedule 19.02.2013
comment
можете да получите distmat и като replicate(length(y), y) - t(replicate(length(y), y)). - person Arun; 19.02.2013
comment
Освен това резултатът, който сте създали тук, може да бъде получен от dist(1:10, method="manhattan") - person Arun; 19.02.2013
comment
Просто се надявам, че възнамерявате да използвате определението за разстояние със знак, както в en.wikipedia.org/wiki/Signed_distance , в който случай не е съвсем ясно какъв е вашият интериор/екстериор. Нека бъдем ясни: разстоянието по стриктна дефиниция е неотрицателно. Търсите ли по същество векторни местоположения (напр. точка при (-3,-2), която има евклидово разстояние sqrt(3^2 + 2^2) от началото)? - person Carl Witthoft; 19.02.2013
comment
@Arun, но OP изрично поиска възможността за получаване на отрицателни разстояния, което method = "manhattan" не изпълнява (примерът е лош, тъй като не показва това изискване. - person cbeleites unhappy with SX; 19.02.2013
comment
@cbeleites, да, разбирам, но крайният резултат премахва отрицателните стойности. Ето защо споменах резултатите, които сте произвели тук... вероятно е трябвало да бъдат distmat[lower.tri(distmat, diag=TRUE)] <- NA вместо това. - person Arun; 19.02.2013