通过一个应急矩阵,我们可以计算每一行之间的相异度并将输出结果转换为一个数据框(data.frame)。
例如,使用布雷-柯蒂斯距离(Bray-Curtis distance),我们可以得到:
# Generate matrix -------------------------------------------------------------
set.seed(1)
ex <- matrix(data = round(runif(100000), 1), nrow = 1000, ncol = 100)
rownames(ex) <- paste0("row", 1:nrow(ex))
colnames(ex) <- paste0("col", 1:ncol(ex))
ex[1:5, 1:5]
col1 col2 col3 col4 col5
row1 0.3 0.5 0.9 0.8 0.2
row2 0.4 0.7 1.0 0.5 0.5
row3 0.6 0.4 0.9 0.2 0.0
row4 0.9 1.0 0.4 0.4 0.5
row5 0.2 0.1 0.2 0.8 0.9
# Dissimilarity ---------------------------------------------------------------
# Example of Bray-Curtis
library(ecodist)
bray <- bcdist(ex, rmzero = FALSE)
bray <- as.matrix(bray)
bray[upper.tri(bray)] <- NA
diag(bray) <- NA
# Convert distance matrix into data.frame
bray <- reshape2::melt(bray, varnames = c("id1", "id2"))
# Remove NAs
bray <- bray[complete.cases(bray), ]
head(bray)
id1 id2 value
2 row2 row1 0.2767599
3 row3 row1 0.3541247
4 row4 row1 0.3588235
5 row5 row1 0.3935618
6 row6 row1 0.2948328
7 row7 row1 0.4045643
现在,我想知道是否可以从长格式的数据框作为输入得到与之前相同的输出 bray
(即具有3列的 data frame
)。
例如,如果我们将上面提供的示例 matrix
转换为:
# From a data.frame -----------------------------------------------------------
ex_df <- reshape2::melt(ex)
colnames(ex_df) <- c("row", "col", "value")
是否有可能获得相同的bray
输出结果,其中包含每一对行之间的Bray-Curtis异质性?
我敢打赌,存在高效的dplyr
或data.table
解决方案。