如何在第n次出现指定字符后使用tidyr拆分数据列?
使用tidyr::separate按指定位置下划线拆分列
针对你的需求,我们可以利用正则表达式的正向后顾断言精准匹配第n个下划线作为拆分点,结合tidyr::separate函数实现拆分。以下是具体解决方案:
生成df1(按第1个下划线拆分)
library(tidyverse) df <- tibble(col1 = c("2397_A_run379_CTTGTACT_S119_L004_R1_001", "3779_A_run535_TTATAGCC_S91_L003_R1_001", "4958_BV_run685_GCGTACGT_S89_L005_R1_001")) df1 <- df %>% separate(col1, into = c("col1", "col2"), sep = "(?<=^[^_]+)_") df1 #> # A tibble: 3 × 2 #> col1 col2 #> <chr> <chr> #> 1 2397 A_run379_CTTGTACT_S119_L004_R1_001 #> 2 3779 A_run535_TTATAGCC_S91_L003_R1_001 #> 3 4958 BV_run685_GCGTACGT_S89_L005_R1_001
生成df2(按第2个下划线拆分)
df2 <- df %>% separate(col1, into = c("col1", "col2"), sep = "(?<=^[^_]+_[^_]+)_") df2 #> # A tibble: 3 × 2 #> col1 col2 #> <chr> <chr> #> 1 2397_A run379_CTTGTACT_S119_L004_R1_001 #> 2 3779_A run535_TTATAGCC_S91_L003_R1_001 #> 3 4958_BV run685_GCGTACGT_S89_L005_R1_001
生成df3(按第3个下划线拆分)
df3 <- df %>% separate(col1, into = c("col1", "col2"), sep = "(?<=^[^_]+_[^_]+_[^_]+)_") df3 #> # A tibble: 3 × 2 #> col1 col2 #> <chr> <chr> #> 1 2397_A_run379 CTTGTACT_S119_L004_R1_001 #> 2 3779_A_run535 TTATAGCC_S91_L003_R1_001 #> 3 4958_BV_run685 GCGTACGT_S89_L005_R1_001
原理说明
正则表达式中的(?<=...)是正向后顾断言,用来匹配满足“前面是指定内容”的位置:
(?<=^[^_]+)_:匹配前面是「从开头到第一个下划线前的任意非下划线字符」的那个下划线,即第1个下划线(?<=^[^_]+_[^_]+)_:匹配前面是「开头到第二个下划线前的两段非下划线字符(用下划线连接)」的那个下划线,即第2个下划线- 以此类推,每增加一段
_[^_]+,就能匹配第n个下划线作为拆分点
这种方式能精准控制拆分位置,确保拆分后前半部分保留指定前缀,后半部分合并剩余所有内容。
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

