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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:04