求助:如何沿样带计算物种(ASVs)的纬度分布范围?
计算ASV(物种)的纬度分布范围解决方案
核心思路
- 将宽格式的ASV丰度数据转换为长格式,便于按单个物种分组计算
- 过滤掉丰度为0的记录,仅保留物种实际存在的站点数据
- 按ASV分组,计算每个物种的纬度跨度:最大纬度 - 最小纬度(南纬数值越大越靠北,差值为正,直接代表纬度范围的度数)
R代码实现
# 加载tidyverse工具包(包含数据转换和分组计算的核心函数) library(tidyverse) # 导入你提供的测试数据 test <- structure(list(Station_neat = c("001_DCM", "001_SA", "003_DCM", "003_SA", "005_DCM", "005_SA", "007_DCM", "007_SA", "009_DCM", "009_SA", "011_DCM", "011_SA", "013_DCM", "013_SA", "015_DCM", "015_SA", "017_DCM", "017_SA", "019_DCM", "019_SA", "021_DCM", "021_SA", "023_DCM", "023_SA", "025_DCM", "025_SA", "027_DCM", "027_SA", "029_DCM", "029_SA"), Lat = c(-29.997, -29.997, -30.9975, -30.9975, -31.9995, -31.9995, -32.99816667, -32.99816667, -34.00016667, -34.00016667, -34.9995, -34.9995, -36.00083333, -36.00083333, -36.9985, -36.9985, -38.00016667, -38.00016667, -38.99833333, -38.99833333, -39.999, -39.999, -40.99783333, -40.99783333, -42.0005, -42.0005, -42.99633333, -42.99633333, -43.9975, -43.9975), asv_3 = c(80, 0, 65, 0, 41, 0, 50, 0, 44, 0, 53, 0, 59, 0, 38, 0, 43, 0, 25, 0, 29, 51, 35, 22, 133, 35, 159, 83, 965, 414), asv_4 = c(766, 694, 286, 791, 421, 1202, 382, 431, 484, 684, 431, 529, 454, 722, 621, 370, 472, 439, 394, 243, 414, 518, 297, 300, 574, 396, 395, 1359, 1113, 541), asv_5 = c(1314, 2812, 729, 2874, 915, 3720, 1226, 2046, 940, 1783, 1220, 2627, 986, 3195, 1514, 566, 590, 1603, 325, 667, 748, 932, 616, 339, 1167, 1088, 988, 2333, 1563, 2146)), row.names = c(NA, 30L), class = "data.frame") # 数据转换与纬度范围计算 asv_lat_stats <- test %>% # 把所有asv开头的列转为长格式,区分物种和丰度 pivot_longer(cols = starts_with("asv_"), names_to = "ASV", values_to = "Abundance") %>% # 只保留丰度不为0的记录 filter(Abundance != 0) %>% # 按物种分组计算 group_by(ASV) %>% summarise( Min_Lat = min(Lat), # 物种分布的最南纬度 Max_Lat = max(Lat), # 物种分布的最北纬度 Lat_Range = Max_Lat - Min_Lat, # 纬度分布范围(度数) Mean_Lat = mean(Lat) # 物种分布的平均纬度(用于散点图) ) # 查看计算结果 print(asv_lat_stats)
结果说明
Min_Lat:该物种出现的最靠南的纬度(数值最小)Max_Lat:该物种出现的最靠北的纬度(数值最大)Lat_Range:纬度分布范围,与你示例中的计算逻辑一致(如-35°到-40°的跨度为5°)Mean_Lat:物种分布的平均纬度,可用于绘制你提到的平均纬度与纬度范围散点图
绘制散点图代码
如果需要生成散点图,可在上述代码基础上添加:
ggplot(asv_lat_stats, aes(x = Mean_Lat, y = Lat_Range)) + geom_point(size = 2) + labs(x = "平均纬度", y = "纬度分布范围(°)") + theme_bw()
内容的提问来源于stack exchange,提问作者CoccoLoco
相关产品推荐
相关产品推荐

