R语言如何仅按首个点号和竖线分隔符拆分字符串为多列
解决方案
方案1:使用tidyverse直接提取目标内容(推荐,逻辑清晰不易出错)
不需要处理复杂的拆分规则,直接用正则提取你需要的字段即可:
library(tidyverse) # 构造示例数据 myString <- c("ENSG00000185561.10|TLCD2", "ENSG00000124785.9|NRN1", "ENSG00000287339.1|RP11-575F12.4") # 输出2列结果 res_2col <- tibble( col1 = str_extract(myString, "^[^.]+"), # 匹配开头到第一个点号前的所有内容 col2 = str_extract(myString, "(?<=\\|).+$") # 匹配竖线之后的所有内容 ) # 输出3列结果 res_3col <- tibble( col1 = str_extract(myString, "^[^.]+"), col2 = str_extract(myString, "(?<=\\.)[^|]+"), # 匹配第一个点号到竖线之间的内容 col3 = str_extract(myString, "(?<=\\|).+$") )
方案2:base R分步拆分
如果你不想加载第三方包,可以分两步拆分,避免误拆分竖线右侧的点号:
# 第一步按竖线拆分,每个字符串仅拆为2部分 split_pipe <- strsplit(myString, "|", fixed = TRUE) col_right <- sapply(split_pipe, `[`, 2) left_part <- sapply(split_pipe, `[`, 1) # 第二步对左侧部分按点号拆分 split_dot <- strsplit(left_part, ".", fixed = TRUE) col1 <- sapply(split_dot, `[`, 1) col_mid <- sapply(split_dot, `[`, 2) # 2列结果 res_2col_base <- data.frame(col1 = col1, col2 = col_right) # 3列结果 res_3col_base <- data.frame(col1 = col1, col2 = col_mid, col3 = col_right)
原方法失效原因说明
你之前的写法里,strsplit默认会拆分所有匹配到的分隔符,正则里的{1}是对单个匹配规则的量词限制,不会限制整体拆分次数,所以会把竖线后符合条件的点号也一并拆分。分步拆分或者直接提取目标字段的方式可以完全规避这个问题。
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

