如何用Vegan提取质心间距离至数据框?批量计算逐年质心距离
批量计算多年份生物数据集的质心距离
方法思路
通过循环或函数式编程自动生成年份分组,结合vegan::vegdist()计算高维距离矩阵,再用usedist::dist_between_centroids()批量计算质心距离,无需手动输入分组向量。
示例代码(基于Dune数据集)
1. 加载依赖包与预处理数据
先模拟含年份分组的生物数据集,实际使用时替换为你的真实数据:
library(vegan) library(usedist) library(dplyr) library(purrr) # 加载Dune数据集并模拟10年分组(可扩展为20年) data(Dune) set.seed(123) dune_data <- Dune %>% mutate(Year = sample(1990:1999, nrow(Dune), replace = TRUE)) %>% arrange(Year) # 按年份排序
2. 批量计算相邻年份的质心距离
按时间顺序计算连续年份间的质心距离:
# 获取排序后的唯一年份 unique_years <- sort(unique(dune_data$Year)) # 生成相邻年份对 adjacent_pairs <- map(1:(length(unique_years)-1), ~c(unique_years[.x], unique_years[.x+1])) # 批量计算距离 adjacent_distances <- map_dfr(adjacent_pairs, function(pair){ y1 <- pair[1] y2 <- pair[2] # 提取目标年份的样本 subset_data <- dune_data %>% filter(Year %in% pair) # 自动生成分组向量 group_vec <- factor(subset_data$Year, levels = pair) # 计算高维距离矩阵(这里用Bray-Curtis,可替换为euclidean等) dist_mat <- vegdist(subset_data[, 1:20], method = "bray") # 计算质心距离 dist_val <- dist_between_centroids(dist_mat, group_vec) # 返回结果行 data.frame(Year_Pair = paste(y1, y2, sep = "-"), Distance = dist_val) }) # 查看结果 print(adjacent_distances)
3. 批量计算所有年份两两的质心距离
如果需要对比所有年份组合的质心距离:
# 生成所有年份对 all_year_pairs <- combn(unique_years, 2, simplify = FALSE) # 批量计算距离 all_distances <- map_dfr(all_year_pairs, function(pair){ y1 <- pair[1] y2 <- pair[2] subset_data <- dune_data %>% filter(Year %in% pair) group_vec <- factor(subset_data$Year, levels = pair) dist_mat <- vegdist(subset_data[, 1:20], method = "bray") dist_val <- dist_between_centroids(dist_mat, group_vec) data.frame(Year_Pair = paste(y1, y2, sep = "-"), Distance = dist_val) }) # 按年份对排序输出 all_distances <- all_distances %>% arrange(Year_Pair) print(all_distances)
关键说明
- 距离方法:
vegdist()支持多种距离算法,可根据数据类型替换method参数(如euclidean、jaccard)。 - 数据适配:真实数据只需确保
Year列是正确的年份变量,且物种数据位于对应列范围(代码中[,1:20]需替换为你的物种列区间)。 - 效率优化:20年数据的循环计算效率足够,若样本量极大,可考虑用
data.table替换dplyr提升速度。
内容的提问来源于stack exchange,提问作者Joshua Smith
相关产品推荐
相关产品推荐

