2013-09-23 3 views
1

У меня есть вопрос R. У меня есть алгоритм, в уме, который делает это, но было интересно, если есть аккуратнее способы сделать следующее:R сравнение возможностей для создания матрицы расстояний

Допустим, вы имеете следующую матрицу:

 [,1] [,2] [,3] [,4] [,5] 
[A,] 0 0 0 0 1 
[B,] 0 0 0 1 1 
[C,] 0 0 1 1 1 
[D,] 0 0 1 1 0 
[E,] 1 0 0 0 0 
[F,] 1 1 1 0 0 

Теперь я хочу, чтобы создать еще одну матрицу различия каждой строки в другой строке (т.е. матрица расстояний) что-то вроде (хотя я его наполовину заполнен, это просто зеркало, чтобы получить верхнюю часть):

 [,A] [,B] [,C] [,D] [,E] [,F] 
[A,] 0  
[B,] 1 0  
[C,] 2 1 0  
[D,] 3 2 1 0  
[E,] 2 3 4 3 0 
[F,] 4 5 4 3 2 0 

Мой метод заключается в использовании цикла сравнения каждого столбцов строки с соответствующими столбцами строк ниже, но wi го больших матриц его неэффективно. Любые идеи о том, как сделать это лучше?

ТНХ

+3

использования 'расстояние (т (мат), тип = "Манхеттен")' (или что-то в этом роде)? –

ответ

2

Как сказано в комментарии, используя dist с manhattan методом:

dt <- read.table(text='  [,1] [,2] [,3] [,4] [,5] 
[A,] 0 0 0 0 1 
[B,] 0 0 0 1 1 
[C,] 0 0 1 1 1 
[D,] 0 0 1 1 0 
[E,] 1 0 0 0 0 
[F,] 1 1 1 0 0') 

mm <- as.matrix(dt) 
dist(mm,method='manhattan' ,diag=TRUE) 

     [A,] [B,] [C,] [D,] [E,] [F,] 
[A,] 0       
[B,] 1 0      
[C,] 2 1 0    
[D,] 3 2 1 0   
[E,] 2 3 4 3 0  
[F,] 4 5 4 3 2 0 
+0

Ничего себе, это круто! Поэтому, когда я говорю dist_cmat = dist (mm, method = 'manhattan'), переменная dist_cmat не является матрицей, возможно ли получить матрицу из этой функции? – StudentOfScience

+0

Да ... вы просто принуждаете результат с помощью 'as.matrix' – agstudy

+0

dist_cmat = as.matrix (dist (mm, method = 'manhattan')) работает !!!! thx все! – StudentOfScience

Смежные вопросы