r-有没有一种快速的方法来计算两个数据集之间的布雷距离



我没有为R包中的两个数据集找到合适的bray距离(bray-Curtis指数(函数。所以我创建了一个,但它非常耗时。有更快的方法吗?

bray_dist <- function(a, b) {
a_len = dim(a)[1]
b_len = dim(b)[1]
distmatrix = matrix(data=NA, nrow=a_len, ncol=b_len)
for(i in seq(1,a_len)) {
for(j in seq(1,b_len)) {
distmatrix[i,j] = 2*sum(pmin(a[i,], b[j,]))/(sum(a[i,]) + sum(b[j,]))
}
}
return(distmatrix)
}

这是一个数据的例子,我的真实数据比这个大,因为我重复了很多次,所以需要很长时间

a <- matrix( round(rnorm(400, 4)), ncol=5)
b <- matrix( round(rnorm(500, 5)), ncol=5)

如果我使用bray_dist函数,则需要9.700986秒的

tstart<-Sys.time()
for (i in 1:100){
c<-bray_dist(a,b)
}
Sys.time()-tstart

如果使用下面Mohanasundaram显示的b_dist,它将需要8.709085秒,比以前的时间更好,但仍然不那么好。

tstart<-Sys.time()
for (i in 1:100){
c<-b_dist(a,b)
}
Sys.time()-tstart

使用应用函数,我可以看到100乘100矩阵相差0.03秒

b_dist <- function(a, b){
d <- t(apply(a, 1, function(x) apply(b, 1, function (y) 2*sum(pmin(x, y)/(sum(x) + sum(y))))))
return(d)
}

最新更新