如何按多条件对数据分箱以构建Bray-Curtis相似性矩阵
实现方案
以下提供生态数据分析领域常用的两种代码实现方式,均可直接得到符合Bray-Curtis相似性矩阵计算要求的计数表:
Python 实现(依赖pandas、numpy)
1. 深度分箱处理
import pandas as pd import numpy as np # 定义10个深度分箱的边界与标签 bin_edges = np.arange(0, 3300, 300) bin_labels = [f"{i*300}-{(i+1)*300}m" for i in range(10)] # 读取原始观测数据 raw_df = pd.read_csv("你的原始数据文件路径.csv") # 新增深度分箱列,include_lowest参数保证深度为0、3000的边界值不会被漏算 raw_df["depth_bin"] = pd.cut( raw_df["深度"], bins=bin_edges, labels=bin_labels, include_lowest=True )
2. 生成taxa计数宽表
根据你的分析需求选择样本聚合维度:
- 按「区域+深度分箱+生境特征」为唯一样本:
# 按分组统计每个taxa的总个体数 count_df = raw_df.groupby( ["所属区域", "depth_bin", "生境特征", "taxa"] )["个体数量"].sum().reset_index() # 转成宽表,未观测到的taxa计数填0 output_df = count_df.pivot_table( index=["所属区域", "depth_bin", "生境特征"], columns="taxa", values="个体数量", fill_value=0 ).reset_index()
- 若不需要区分生境,仅按「区域+深度分箱」为样本,删除上述代码中分组参数里的
生境特征即可。
3. 导出结果
output_df.to_csv("taxa_count_braycurtis.csv", index=False, encoding="utf-8-sig")
导出的表格前3列为样本属性,后续每列对应一个taxa,单元格为对应个体计数,可直接输入至vegan、scikit-bio等库计算Bray-Curtis矩阵。
R 实现(依赖dplyr、tidyr)
library(dplyr) library(tidyr) # 读取数据 raw_df <- read.csv("你的原始数据文件路径.csv", stringsAsFactors = FALSE) # 深度分箱 bin_edges <- seq(0, 3300, 300) bin_labels <- paste0(seq(0, 2700, 300), "-", seq(300, 3000, 300), "m") raw_df$depth_bin <- cut( raw_df$深度, breaks = bin_edges, labels = bin_labels, include.lowest = TRUE ) # 生成计数宽表并导出 output_df <- raw_df %>% group_by(所属区域, depth_bin, 生境特征, taxa) %>% summarise(个体数量 = sum(个体数量), .groups = "drop") %>% pivot_wider(names_from = taxa, values_from = 个体数量, values_fill = 0) write.csv(output_df, "taxa_count_braycurtis.csv", row.names = FALSE, fileEncoding = "utf-8")
注意事项
- 若原始数据中存在超过3000米的深度记录,可先过滤后再做分箱,或扩展bin_edges的上限值
- 若深度记录用负数表示水深,将bin_edges调整为
seq(-3000, 300, 300)即可匹配分箱逻辑
内容的提问来源于stack exchange,提问作者Gina
相关产品推荐
相关产品推荐

