如何用R/data.table拆分分类路径列并按门级汇总计数
处理data.table分类路径的层级统计问题
我来帮你搞定这个data.table的分类层级统计需求,用data.table原生的语法就能高效完成,而且很容易扩展到门、纲、目等任意分类层级。
第一步:构建可复现的示例数据
先把你给出的5行示例数据转换成data.table对象,方便后续操作:
library(data.table) dt <- data.table( taxpath = c( "Bacteroidetes; Flavobacteriia; Flavobacteriales; Flavobacteriaceae; Formosa; Formosa sp. Hel3_A1_48", "Bacteroidetes; Flavobacteriia; Flavobacteriales; Cryomorphaceae; NA; Cryomorphaceae bacterium BACL29 MAG-121220-bin8", "Proteobacteria; Alphaproteobacteria; Pelagibacterales; Pelagibacteraceae; Candidatus Pelagibacter; NA", "Proteobacteria; Alphaproteobacteria; Pelagibacterales; NA; NA; NA", "Planctomycetes; NA; NA; NA; NA; Planctomycetes bacterium TMED84" ), N = c(57, 54, 53, 41, 41) )
第二步:提取门级分类并求和
用data.table的tstrsplit()函数拆分taxpath列(按分号+空格的分隔符),提取第一个元素就是门级分类,再按门分组求和:
# 提取门级并计算总计数 dt_phylum <- dt[, .(phylum = tstrsplit(taxpath, "; ")[[1]], N)][, .(Nnew = sum(N)), by = phylum] # 查看结果 dt_phylum
运行后就能得到你想要的输出:
phylum Nnew 1: Bacteroidetes 111 2: Proteobacteria 94 3: Planctomycetes 41
第三步:扩展到其他分类层级
如果要处理纲、目、科等其他层级,只需要调整tstrsplit提取的索引即可,比如:
- 提取纲级(第二个元素):
dt_class <- dt[, .(class = tstrsplit(taxpath, "; ")[[2]], N)][, .(Nnew = sum(N)), by = class]
- 提取目级(第三个元素):
dt_order <- dt[, .(order = tstrsplit(taxpath, "; ")[[3]], N)][, .(Nnew = sum(N)), by = order]
补充说明
tstrsplit()是data.table专为拆分字符串列设计的函数,比基础R的strsplit()更高效,适合处理大型data.table- 拆分时用
"; "作为分隔符,是因为你的taxpath里分号后面跟着空格,这样拆分出来的元素不会带多余空格 - 如果有些层级是
NA,分组时会自动把NA作为一个单独的组,如果你想过滤掉NA的组,可以在后面加[!is.na(层级列)],比如:
# 过滤掉门级为NA的组(示例中没有,但实际数据可能存在) dt_phylum_clean <- dt[, .(phylum = tstrsplit(taxpath, "; ")[[1]], N)][!is.na(phylum), .(Nnew = sum(N)), by = phylum]
内容的提问来源于stack exchange,提问作者Revan
相关产品推荐
相关产品推荐

