如何重排OTU/ASV频率表中顺序错乱的样本列?
扩增子OTU/ASV频率表样本列重排操作方法
针对30个样本的列顺序错乱问题,无需逐列手动调整,基于自然排序逻辑可在数秒内完成重排,完全匹配人对“样本编号B1、B2、B3…Bn”的排序直觉。
R 环境实现(适配绝大多数扩增子分析流程)
- 操作原理:自动识别列名末尾的数字编号,跳过普通字符串排序的缺陷,直接生成符合预期的列顺序,再完成表格重排、导出
- 可直接复用的代码块:
# 首次运行先安装依赖 install.packages(c("gtools")) library(gtools) # 读入原始ASV/OTU表,设置OTU/ASV列为行名,保留原始列名不做格式转换 raw_tab <- read.delim("raw_asv_table.tsv", row.names = 1, check.names = FALSE) # 对所有样本列名做自然排序 sorted_sample_cols <- mixedsort(colnames(raw_tab)) # 校验排序结果是否符合预期 print(sorted_sample_cols) # 按照校验后的顺序重排列,导出校正后的表格 corrected_tab <- raw_tab[, sorted_sample_cols] write.table(corrected_tab, "corrected_asv_table.tsv", sep = "\t", quote = FALSE, col.names = NA)
Python 环境实现
- 操作逻辑和R方案完全一致,依赖自然排序库避免字典序错乱
- 可直接复用的代码块:
# 首次运行先安装依赖 # pip install pandas natsort import pandas as pd from natsort import natsorted # 读入原始ASV/OTU表 raw_df = pd.read_csv("raw_asv_table.tsv", sep="\t", index_col=0) # 对列名做自然排序 sorted_cols = natsorted(raw_df.columns) # 按顺序重排列并导出 corrected_df = raw_df[sorted_cols] corrected_df.to_csv("corrected_asv_table.tsv", sep="\t", index=True)
Excel 无代码临时操作
适合不想启动编程环境的临时场景,30个样本5分钟内可完成:
- 将表格所有样本列名复制到表格下方的空白行
- 选中这行复制的样本名,依次点击「数据-排序」,在弹窗中选择「按行排序」,排序依据为当前选中行,次序选择「升序」,即可得到符合直觉的排序结果
- 按照排好的样本名顺序,逐列剪切粘贴到新的空白工作表中,校验顺序一致后导出即可
关键注意事项
- 避开普通字符串排序的坑:直接用默认的字典序排序时,会出现
sample-B1、sample-B10、sample-B11、sample-B2的错误顺序,所有上述方案均采用自然排序逻辑,会自动识别列名中的数字段做数值大小比较,和人工排序的结果完全一致 - 操作前备份原始频率表,避免误操作覆盖原始结果
- 导出后可随机抽查几列的位置,确认和记录的样本编号顺序一致后,再接入下游分析流程
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

