创建具有多个分隔符的两列

chi*_*tra 5 regex r dataframe delimiter-separated-values

我有一个数据框,例如

COl1
scaffold_97606_2-BACs_-__SP1_1
UELV01165908.1_2-BACs_+__SP2_2
UXGC01046554.1_9-702_+__SP3_3
scaffold_12002_1087-1579_-__SP4_4
Run Code Online (Sandbox Code Playgroud)

我想将两者分成两列并得到:

COL1           COL2 
scaffold_97606 2-BACs_-__SP1_1
UELV01165908.1 2-BACs_+__SP2_2
UXGC01046554.1 9-702_+__SP3_3
scaffold_12002 1087-1579_-__SP4_4
Run Code Online (Sandbox Code Playgroud)

所以你可以看到分隔符的变化,它可以是.Number_Number_Number

到目前为止,我写道;

df2 <- df1 %>%
    separate(COL1, paste0('col', 1:2), sep = " the separator patterns ", extra = "merge")
Run Code Online (Sandbox Code Playgroud)

但我不知道我应该在这" the separator patterns "部分使用什么分隔符

Wik*_*żew 6

您可以使用

> df1 %>%
    separate(COl1, paste0('col', 1:2), sep = "(?<=\\d)_(?=\\d+-)", extra = "merge")
            col1               col2
1 scaffold_97606    2-BACs_-__SP1_1
2 UELV01165908.1    2-BACs_+__SP2_2
3 UXGC01046554.1     9-702_+__SP3_3
4 scaffold_12002 1087-1579_-__SP4_4
Run Code Online (Sandbox Code Playgroud)

查看正则表达式演示

图案详情

  • (?<=\d) - 正向后视,需要在当前位置左侧紧接一个数字
  • _ - 下划线
  • (?=\d+-)- 正向前瞻,需要一位或多位数字,然后-立即在当前位置的右侧。


Ron*_*hah 5

You can use extract :

tidyr::extract(df, COl1, c('Col1', 'Col2'), regex = '(.*?\\d+)_(.*)')

#            Col1               Col2
#1 scaffold_97606    2-BACs_-__SP1_1
#2 UELV01165908.1    2-BACs_+__SP2_2
#3 UXGC01046554.1     9-702_+__SP3_3
#4 scaffold_12002 1087-1579_-__SP4_4
Run Code Online (Sandbox Code Playgroud)

data

df <- structure(list(COl1 = c("scaffold_97606_2-BACs_-__SP1_1", 
"UELV01165908.1_2-BACs_+__SP2_2", 
"UXGC01046554.1_9-702_+__SP3_3", "scaffold_12002_1087-1579_-__SP4_4"
)), class = "data.frame", row.names = c(NA, -4L))
Run Code Online (Sandbox Code Playgroud)