我已经编写了一个短小的“for”循环,以查找数据框中每一行与所有其他行之间的最小欧几里得距离(并记录最接近的行)。理论上,这避免了尝试计算非常大矩阵的距离度量所涉及的错误。然而,虽然在内存方面没有节省太多空间,但对于大矩阵来说非常慢(我的用例有约150K行仍在运行)。
我想知道是否有人能为我提供建议或指引,以便使用apply或类似工具向量化我的函数。对于这个可能看起来很简单的问题,我还在努力思考如何以向量化的方式解决。
谢谢你们的帮助和耐心。
我想知道是否有人能为我提供建议或指引,以便使用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)
all.min.dist <- rbind(all.min.dist, ...)
非常糟糕,因为它会在每次迭代时创建一个更大的对象。请阅读有关预分配的内容。 - flodel