2016-06-21 2 views
-1

Мне нужно создать матрицу расстояний от матрицы, которая возвращает расстояние между столбцами.создать матрицу расстояний в R (без использования dist())

Я ЗНАЛ, что существует функция, называемая dist(), но я не могу ее использовать, потому что я буду использовать не общие функции расстояния.

Я думал об использовании приложения, но я не знаю, как его написать.

Петля Я создал это:

dista <- function(A,distance){ 
    dist_matrix=matrix(0,dim(A)[2],dim(A)[2]) 
    for (i in 1:(dim(A)[2]-1)){ 
    for(j in (i+1):(dim(A)[2])){ 
     if(distance=='cosine') dist_matrix[j,i]<- (1-sum(A[,i]*A[,j]))/(sqrt(sum(A[,i]^2))+sqrt(sum(A[,j]^2))) 
    } 
    } 
    dist_matrix 
} 
+2

Можете ли вы опубликовать пример своих столбцов данных и ожидаемого результата? Возможно, даже код цикла, который вы написали, медленный? – Gopala

+0

Более подробная информация поможет. –

+0

Я только что написал цикл, моя матрица 129569rows x 60columns – cdom

ответ

1

Если у вас есть какой-то кадр данных, как это:

df <- data.frame(x = rnorm(10, 5, 1), y = rnorm(10)) 

Вы можете использовать применяются следующим образом:

apply(df, 1, dist) 

Чтобы использовать функция расстояния до клиента, вы можете заменить вызов на dist выше:

apply(df, 1, my_own_dist) 

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

EDIT на основе комментариев ниже ....

Если вы пытаетесь вычислить парного расстояние между каждой парой столбцов исходной матрицы А, вы можете попробовать что-то вроде этого:

apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x])) 

Сначала создайте все уникальные пары столбцов и пропустите их по одному за раз

+0

Спасибо, но я используйте расстояние от косинуса так, как я могу его записать? – cdom

+0

Если вы пытаетесь вычислить парное расстояние между каждой парой столбцов в исходной матрице A, вы можете попробовать что-то вроде этого: 'apply (combn (1: ncol (A), 2), 2, function (x) my_dist_function (A [, x])). Сначала создайте все уникальные пары столбцов и пропустите их по одному. – Gopala

+0

Спасибо, это именно то, что мне нужно – cdom

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

  • Нет связанных вопросов^_^