R使用Vegan提取质心到数据框之间的距离

标签 r similarity vegan centroid multi-dimensional-scaling

我有一个生物数据集,我想计算质心之间的距离,每个质心代表给定的年份(因此距离是按顺序计算的)。我正在探索 usedist::dist_ Between_centroids() 来计算高维空间中的距离,但这似乎相当困难,因为该函数需要分组变量(在本例中为年份)的向量输入。我已经探索了 vegan::adonis() 作为替代函数,但我不知道如何提取距离。我使用 Dune 附加了一些示例数据,并将其中一个因素重新编码为“年份”。我的实际数据集包含大约 20 年的数据,因此像我下面所做的那样手动计算距离是不切实际的。我认为使用 dist_ Between_centroids() 的循环可以完成此任务,但我不确定如何在循环中指定分组向量。


# Species and environmental data
require(vegan)
require(usedist)

dune <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.spe.txt', row.names = 1)

dune.env <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.env.txt', row.names = 1)

data(dune) 
data(dune.env)

all_data <- cbind(dune.env, dune) %>%
              arrange(Use)

all_data$Use <- recode_factor(all_data$Use, "Hayfield"="2017")
all_data$Use <- recode_factor(all_data$Use, "Haypastu"="2018")
all_data$Use <- recode_factor(all_data$Use, "Pasture"="2019")


bio_data <- all_data[,6:35] 

bio_distmat <- vegdist(bio_data, method = "bray", na.rm=T) 


#store distance in matrix
dist_between_mat <- as.data.frame(matrix(ncol=3, nrow=2))
colnames(dist_between_mat) <- c("start_centroid","end_centroid","distance")

dist_between_mat[1,1] = "2017"
dist_between_mat[1,2] = "2018"
dist_between_mat[1,3] = dist_between_centroids(bio_distmat, 1:7,8:15) #distance between 2017 and 2018

dist_between_mat[2,1] = "2018"
dist_between_mat[2,2] = "2019"
dist_between_mat[2,3] = dist_between_centroids(bio_distmat, 8:15,16:20) #distance between 2018 and 2019


最佳答案

您可以使用简单的 for 循环来完成此操作。但是,当我们可以使用“整洁”原则时,为什么要编写简单的代码呢?

这是一个迭代开始年份和结束年份的解决方案,生成单行小标题,然后将各行连接成最终小标题。

请注意,在您的可重现示例中,年份/级别按时间倒序排列。我使用级别排序,而不将级别转换为年份,因此请确保这是您想要的顺序。

levels(all_data$Use)
#> [1] "2019" "2018" "2017"

n <- nlevels(all_data$Use)

start <- levels(all_data$Use)[1:(n - 1)]
start
#> [1] "2019" "2018"
end <- levels(all_data$Use)[2:n]
end
#> [1] "2018" "2017"

map2_dfr(start, end, ~ {
  idx1 <- which(all_data$Use == .x)
  idx2 <- which(all_data$Use == .y)
  tibble(
    start_centroid = .x,
    end_centroid = .y,
    distance = dist_between_centroids(bio_distmat, idx1, idx2)
  )
})
#> # A tibble: 2 × 3
#>   start_centroid end_centroid distance
#>   <chr>          <chr>           <dbl>
#> 1 2019           2018            0.210
#> 2 2018           2017            0.327

reprex package 于 2022 年 7 月 27 日创建(v2.0.1)

关于R使用Vegan提取质心到数据框之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73129205/

相关文章:

algorithm - 在两个单词列表之间找到 'correlation'

r - R 的 NODF 图中没有显示轴标签

r - 后续: Plotting ordiellipse function from vegan package onto NMDS plot created in ggplot2

r - 文本挖掘,包括模式和数字

r - 使用 R 解码 GS1 字符串

r - 如何在 R 中模拟 Lisp 的 let 函数?

R - 仅具有固定效应的 lfe(felm)拟合模型

mysql - 如何在MYSQL中计算两个字符串之间的相似度

c# - 识别文本消息之间相似性的算法

r - CCA分析: Error in rowSums(X) : 'x' must be numeric