如何在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
相关产品推荐
相关产品推荐

