You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Data Frame中将分类单元注释拆分为独立列

解决分类标识符Data Frame拆分问题

没问题,我来帮你搞定这个分类层级拆分的需求!你的核心问题是没匹配对数据的格式规则,我们一步步来修正:

首先先还原你的测试数据,方便后续操作:

toytax <- structure(list(taxa = structure(1:3, .Label = c("D_0__Archaea;D_1__Altiarchaeota;D_2__Altiarchaeia;D_3__uncultured archaeon;D_4__uncultured archaeon;D_5__uncultured archaeon;D_6__uncultured archaeon", "D_0__Archaea;D_1__Altiarchaeota;D_2__Altiarchaeia;D_3__uncultured euryarchaeote;D_4__uncultured euryarchaeote;D_5__uncultured euryarchaeote;D_6__uncultured euryarchaeote", "D_0__Archaea;D_1__Asgardaeota;D_2__Odinarchaeia;D_3__uncultured euryarchaeote;D_4__uncultured euryarchaeote;D_5__uncultured euryarchaeote;D_6__uncultured euryarchaeote"), class = "factor")), class = "data.frame", row.names = c("otu1", "otu2", "otu3"))

完整解决方案代码

我们可以用tidyr和dplyr组合完成,逻辑清晰且高效:

library(tidyr)
library(dplyr)

# 一步完成转换
final_tax <- toytax %>%
  # 先把factor类型的taxa转成字符,避免后续处理异常
  mutate(taxa = as.character(taxa)) %>%
  # 按分号拆分taxa列,直接指定目标层级的列名
  separate(taxa, into = c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species"), sep = ";") %>%
  # 对所有列清理掉前缀"D_n__"
  mutate(across(everything(), ~gsub("D_\\d+__", "", .)))

代码逻辑解释

  1. 转换字符类型:你的taxa列是factor类型,直接拆分可能出问题,先转成字符更稳妥。
  2. 拆分列:用separate按分号;拆分,因为每一行的分类都严格对应7个层级(Domain到Species),所以直接指定7个目标列名。
  3. 清理前缀:用gsub匹配所有D_数字__的前缀,替换为空,只保留分类名称。这里的正则D_\\d+__表示:匹配D_开头,后面跟任意数量的数字,再跟两个下划线的内容。

最终结果

运行后你会得到想要的格式:

print(final_tax)
#>      Domain          Phylum          Class                     Order                    Family                    Genus                    Species
#> otu1 Archaea Altiarchaeota Altiarchaeia uncultured archaeon uncultured archaeon uncultured archaeon uncultured archaeon
#> otu2 Archaea Altiarchaeota Altiarchaeia uncultured euryarchaeote uncultured euryarchaeote uncultured euryarchaeote uncultured euryarchaeote
#> otu3 Archaea    Asgardaeota    Odinarchaeia uncultured euryarchaeote uncultured euryarchaeote uncultured euryarchaeote uncultured euryarchaeote

你之前尝试的问题分析

  • 你的gsub正则写得过于复杂且匹配规则错误,比如多余的.和错误的转义,根本匹配不上你的数据格式。
  • extract用的正则完全不适用你的数据,你写的是匹配日期、特殊符号的模式,和D_n__分类名称的格式完全不搭,所以肯定失败。

内容的提问来源于stack exchange,提问作者Geomicro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:18:58