在R语言中用正则按第二个竖线和第二个T分割数据列
基于tidyverse与正则的单列DataFrame拆分方案
解决方案代码
library(tidyverse) # 示例数据 ids <- c("ETC|HMPI01000001|HMPI01000001.1 TAG: Genus Species, T05X3Ml2_CL10007Cordes1_1", "ETC|HMPI31000002|HMPI31000002.1 TAG: Genus Species, T3X3Ml2_CL10157Cordes1_1", "ETC|HMPI01000007|HMPI01000007.1 TAG: Genus Species, T1X3Ml2_CL11231Cordes1_1") df <- as.data.frame(ids) # 执行拆分 df_split <- df %>% extract( col = ids, into = c("var1", "var2"), regex = "^[^|]+\\|[^|]+\\|([^\\s]+).*?(T\\S+)", remove = FALSE # 保留原列用于验证,不需要可设为TRUE ) # 查看结果 print(df_split)
代码说明
- 工具选择:使用
tidyverse中的extract函数,它通过正则捕获组直接提取目标片段,比separate更适合这种精准匹配场景。 - 正则表达式解析:
^[^|]+\\|:匹配开头到第一个竖线的内容(如ETC|)[^|]+\\|:匹配第二个竖线之前的内容(如HMPI01000001|)([^\\s]+):第一个捕获组,匹配第二个竖线后到第一个空格前的所有非空格字符(即目标var1).*?:非贪婪匹配中间的冗余内容(如TAG: Genus Species,),避免过度匹配(T\\S+):第二个捕获组,匹配以T开头的所有非空白字符(即目标var2)
预期输出
ids var1 var2 1 ETC|HMPI01000001|HMPI01000001.1 TAG: Genus Species, T05X3Ml2_CL10007Cordes1_1 HMPI01000001.1 T05X3Ml2_CL10007Cordes1_1 2 ETC|HMPI31000002|HMPI31000002.1 TAG: Genus Species, T3X3Ml2_CL10157Cordes1_1 HMPI31000002.1 T3X3Ml2_CL10157Cordes1_1 3 ETC|HMPI01000007|HMPI01000007.1 TAG: Genus Species, T1X3Ml2_CL11231Cordes1_1 HMPI01000007.1 T1X3Ml2_CL11231Cordes1_1
内容的提问来源于stack exchange,提问作者Mata
相关产品推荐
相关产品推荐

