Знаковая матрица расстояний в 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