在R中创建一个距离矩阵(不使用dist())

时间:2016-06-21 16:26:05

标签: r matrix distance

我需要从矩阵创建一个距离矩阵,它返回列之间的距离。

我知道它存在一个名为dist()的函数,但是我不能使用它,因为我不会使用常见的距离函数。

我正在考虑使用apply,但我不知道如何编写它。

我创建的循环是:

 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
}

1 个答案:

答案 0 :(得分:1)

假设你有这样的数据框:

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

您可以按如下方式使用apply:

apply(df, 1, dist)

要使用客户距离功能,您可以将上述dist的呼叫替换为:

apply(df, 1, my_own_dist)

当然,这会循环遍历每一行数据,并且仍然比基于矩阵的计算慢。知道您的距离函数实际上做了什么可能会帮助人们更有效地解决问题。

根据以下评论进行编辑....

如果您尝试计算原始矩阵A中每对列之间的成对距离,您可以尝试这样的事情:

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

首先生成所有唯一的列对,并一次一个地运行它们