R中对数据框所有变量组合应用vegan包函数计算Bray Curtis相异度
解决方案
不用手动构建循环遍历组合,直接用tidyverse的分组汇总功能即可自动匹配所有存在的Workbook/Location/Method组合完成计算,还能避免因数据顺序错位导致的结果错误。
前置依赖
需要提前加载用到的包:
library(tidyverse) library(vegan)
最优实现方案(推荐)
步骤1:批量计算所有分组的Bray-Curtis相异度
bray_cal <- tidy %>% # 按三个字段分组,每组对应一组Vol和Bio的观测 group_by(Workbook, Location, Method) %>% summarise( # 每组内计算距离,转成数值格式方便后续合并 Bray = as.numeric(vegdist(select(cur_data(), Worm, Larvae, Swimmer), method = "bray")), .groups = "drop" )
步骤2:将计算结果合并到目标数据集
BCresult.ex <- BCresult.ex %>% select(-Bray) %>% # 先删除原本全为NA的Bray列 # 按三个匹配字段自动对应赋值,不用考虑两个数据集的行顺序是否一致 left_join(bray_cal, by = c("Workbook", "Location", "Method"))
可选:循环实现方案
如果你更熟悉循环逻辑,可以用以下代码实现,效果和上面的方案一致:
# 生成所有存在的唯一分组组合 group_list <- tidy %>% distinct(Workbook, Location, Method) # 遍历每个分组计算 for(i in 1:nrow(group_list)){ # 提取当前分组的匹配字段 cur_wb <- group_list$Workbook[i] cur_loc <- group_list$Location[i] cur_met <- group_list$Method[i] # 筛选当前分组的观测数据 cur_obs <- filter(tidy, Workbook == cur_wb & Location == cur_loc & Method == cur_met) # 计算相异度 cur_bc <- as.numeric(vegdist(cur_obs[,5:7], "bray")) # 赋值到结果表对应行 BCresult.ex$Bray[BCresult.ex$Workbook == cur_wb & BCresult.ex$Location == cur_loc & BCresult.ex$Method == cur_met] <- cur_bc }
注意事项
运行前可以先检查每个分组的观测数是否符合要求,避免因数据缺失导致计算错误:
group_check <- tidy %>% group_by(Workbook, Location, Method) %>% summarise(obs_num = n(), .groups = "drop") # 输出观测数不等于2的异常分组,可手动处理后再运行计算代码 filter(group_check, obs_num != 2)
内容的提问来源于stack exchange,提问作者HamiltonV
相关产品推荐
相关产品推荐

