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

如何在R中按后缀拆分分类列并填充缺失值?

解决R中物种分类列的拆分问题

当你的物种分类列存在内容缺失(比如部分条目只有门、纲级别,没有科、属)时,tidyr::separate因为依赖固定的分隔位置,确实没办法很好处理。这里提供两种更适配的方案:

方案一:用tidyr::extract_wider批量提取(推荐)

这个函数可以根据正则表达式匹配任意位置的目标内容,自动为缺失项填充NA,代码更简洁:

首先加载依赖包:

library(tidyverse)

假设你的数据框名为df,执行以下代码:

df_processed <- df %>%
  # 按分类级别匹配提取到对应列
  extract_wider(
    col = Classification,
    names = c("K", "P", "C", "O", "F", "G"),
    # 正则匹配每个级别,?表示该级别可缺失,;?匹配可选的分号分隔符
    regex = "(k__[^;]+)?;?(p__[^;]+)?;?(c__[^;]+)?;?(o__[^;]+)?;?(f__[^;]+)?;?(g__[^;]+)?"
  ) %>%
  # 移除每个列开头的k__、p__等前缀
  mutate(across(c(K, P, C, O, F, G), ~ str_remove(., "^[kpcofg]__")))

方案二:用stringr::str_extract逐个提取(更灵活)

如果需要对单个级别做额外处理,逐个提取的方式更可控:

df_processed <- df %>%
  mutate(
    # 匹配每个级别内容,无匹配则返回NA,随后移除前缀
    K = str_extract(Classification, "k__[^;]+") %>% str_remove("^k__"),
    P = str_extract(Classification, "p__[^;]+") %>% str_remove("^p__"),
    C = str_extract(Classification, "c__[^;]+") %>% str_remove("^c__"),
    O = str_extract(Classification, "o__[^;]+") %>% str_remove("^o__"),
    F = str_extract(Classification, "f__[^;]+") %>% str_remove("^f__"),
    G = str_extract(Classification, "g__[^;]+") %>% str_remove("^g__")
  )
# 可选:移除原始分类列
# df_processed <- df_processed %>% select(-Classification)

注意事项

  • 如果你的分类前缀是大写(比如K__),需要把正则里的kpcofg改成大写KPCOFG;
  • 如果分类条目用其他符号分隔(不是分号;),替换正则里的;为对应分隔符即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:22