r - 计算 R 中数据框中每对分类单元之间的差异性

标签 r dataframe dplyr data.table

从一个权变矩阵,我们可以计算每对行之间的差异,然后将输出转换为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 输出? 我打赌存在高效的 dplyrdata.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/

相关文章:

r - 从 UTC 时间获取本地时间

python - 过滤引号内的 df 值

python - 如何按顺序查找和替换偶数位置元素的值

r - 按(行)对的组合过滤

r - 计算连续出现的次数并在找到值后停止

r - 最佳地对一维数据进行聚类?

r - Windows 不支持“mc.cores”> 1

python - 如何创建列表列表,其中子列表是每列的列值

在 R 中按月检索客户的独特比例

r - 不带任何键并排粘贴 2 个数据框