2016-10-17 4 views
0

두 행렬의 행 쌍마다 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

당신은 볼 수 있었다 같은 루프 솔루션 비에 대한' map' 함수를 라이브러리'purrr'에 넣었으나, 이미'd <- data.frame (bray = rep (0, nrow (a)))'라고 차원을 정할 때 엄청난 향상을 보게 될 것입니다. 그렇게하면 매번 더 이상 열리지 않습니다. –

답변

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 
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