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

如何在第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:54