两个矩阵的行之间的不相似性

时间:2016-10-17 16:50:23

标签: r matrix

我想计算两个矩阵的每对行的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")
}

有没有快速实现此操作的方法?

2 个答案:

答案 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
相关问题