我想计算两个矩阵的每对行的Bray-Curtis距离。
到目前为止,我有一个for-loop
,但解决方案根本不是最佳选择。
以下是我想要执行的示例:
a <- matrix(runif(30), 3, 10)
b <- matrix(runif(30), 3, 10)
library(vegan)
d <- data.frame("bray" = 0)
for (i in 1:nrow(a)){
d[i, "bray"] <- vegdist(rbind(a[i, ], b[i, ]), method = "bray")
}
有没有快速实现此操作的方法?
答案 0 :(得分:0)
您可以使用应用功能(例如 lapply
)进行一些改进require(dplyr)
require(vegan)
a <- matrix(runif(30), 30000, 10)
b <- matrix(runif(30), 30000, 10)
system.time(
TMP <- bind_rows(lapply(1:nrow(a),function(y){data.frame(Bray=as.numeric(vegdist(x=rbind(a[y, ], b[y, ]),method="bray")))}))
)
user system elapsed
5.124 0.000 5.126
d <- data.frame("bray" = 0)
system.time(
for (i in 1:nrow(a)){
d[i, "bray"] <- vegdist(rbind(a[i, ], b[i, ]), method = "bray")
}
)
user system elapsed
12.588 0.000 12.590
答案 1 :(得分:0)
这是一个相对较快的解决方案:
library(microbenchmark)
library(vegan)
a <- matrix(runif(30), 3, 10)
b <- matrix(runif(30), 3, 10)
f1 <- function(a,b){
m <- matrix(0, nrow(a)*2, ncol(a))
m[c(T,F),] <- a
m[c(F,T),] <- b
v <- as.matrix(vegdist(m, method = "bray"))
data.frame(bray=diag(v[-1,])[c(T,F)])
}
f2 <- function(a,b){
d <- data.frame("bray" = 0)
for (i in 1:nrow(a))
d[i, "bray"] <- vegdist(rbind(a[i, ], b[i, ]), method = "bray")
d
}
all.equal(f1(a,b), f2(a,b))
# [1] TRUE
microbenchmark(f1(a,b), f2(a,b))
# Unit: microseconds
# expr min lq mean median uq max neval
# f1(a, b) 422.597 441.8445 474.2917 452.3235 487.611 744.248 100
# f2(a, b) 835.782 855.4590 916.9314 873.6370 942.715 1303.718 100