データフレームの各行と他のすべての行の間の最小ユークリッド距離を見つける (そしてどの行が最も近いかを記録する) 短い「for」ループを作成しました。理論的には、これにより、非常に大きな行列の距離測定を計算しようとすることに関連するエラーが回避されます。ただし、メモリに保存される量はそれほど多くありませんが、大きな行列の場合は非常に遅くなります (私の使用例である ~150K 行はまだ実行中です)。
apply などを使用して、関数をベクトル化するという点で、誰かがアドバイスしたり、正しい方向に向けたりできるかどうか疑問に思っています。簡単な質問に見えるかもしれませんが、ベクトル化された方法で考えるのにまだ苦労しています。
事前に感謝します(そしてあなたの忍耐のために)。
require(proxy)
df<-data.frame(matrix(runif(10*10),nrow=10,ncol=10), row.names=paste("site",seq(1:10)))
min.dist<-function(df) {
#df for results
all.min.dist<-data.frame()
#set up for loop
for(k in 1:nrow(df)) {
#calcuate dissimilarity between each row and all other rows
df.dist<-dist(df[k,],df[-k,])
# find minimum distance
min.dist<-min(df.dist)
# get rowname for minimum distance (id of nearest point)
closest.row<-row.names(df)[-k][which.min(df.dist)]
#combine outputs
all.min.dist<-rbind(all.min.dist,data.frame(orig_row=row.names(df)[k],
dist=min.dist, closest_row=closest.row))
}
#return results
return(all.min.dist)
}
#example
min.dist(df)