从一个权变矩阵
,我们可以计算每对行之间的差异,然后将输出转换为data.frame
。
例如,对于 Bray-Curtis 距离,我们可以有:
# 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
现在,我很想知道是否有可能从长格式 data 中获得相同的输出
作为输入。
例如,如果我们将上面提供的示例 bray
(即 data frame
有 3 列)帧matrix
转换为:
# From a data.frame -----------------------------------------------------------
ex_df <- reshape2::melt(ex)
colnames(ex_df) <- c("row", "col", "value")
是否有可能获得包含每对行之间的 Bray-Curtis 差异的相同 bray
输出?
我打赌存在高效的 dplyr
或 data.table
解决方案。
最佳答案
这会实现您所追求的目标吗?基本上,它只是将长格式数据重新排列成类似矩阵的数据帧并从中计算 BC。我想你的实际数据集是长格式的。
library(tidyverse)
BC_dist <- ex_df %>%
spread(2,3) %>%
column_to_rownames("row") %>%
bcdist(rmzero = FALSE)
关于r - 计算 R 中数据框中每对分类单元之间的差异性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60110027/