R - 正则表达式根据第一个点分隔字符串?

Stu*_*acy 2 regex r dplyr tidyr

我有一个填充了包含多个点的字符串的列.我想将此列拆分为两个包含第一个点之前和之后的两个子串.

comb          num
UWEA.n.49.sp   3
KYFZ.n.89.kr   5
     ...
Run Code Online (Sandbox Code Playgroud)

 a         b       num
UWEA    n.49.sp     3
KYFZ    n.89.kr     5
     ...
Run Code Online (Sandbox Code Playgroud)

我正在使用separate函数,tidyr但无法正确使用正则表达式.我试图使用这个答案的正则表达式:

foo %>%
    separate(comb, into=c('a', 'b'),
             sep="([^.]+)\\.(.*)")
Run Code Online (Sandbox Code Playgroud)

因此,该列a应该由([^.]+)包含至少一个非点字符的第一个捕获组确定,然后是第一个点,然后第二个捕获组将(.*)匹配后面的任何剩余字符.

然而,这似乎不匹配任何东西:

a   b   num
         3
         5
Run Code Online (Sandbox Code Playgroud)

这是我的虚拟数据集:

library(dplyr)
library(tidyr)
foo <- data.frame(comb=replicate(10, 
                                 paste(paste(sample(LETTERS, 4), collapse=''),
                                       sample(c('p', 'n'), 1), 
                                       sample(1:100, 1), 
                                       paste(sample(letters, 2), collapse=''), 
                                       sep='.')
                                 ),
                  num = sample(1:10, 10, replace=T))
Run Code Online (Sandbox Code Playgroud)

aos*_*ith 6

在这种情况下,您可以利用该extra = "merge"选项separate.因为separate默认情况下在符号上分隔,所以您不必定义分隔符.如果你愿意,你可以使用"\\."

foo %>%
    separate(comb, into=c('a', 'b'), extra = "merge")

      a       b num
1  NPTE p.10.ku   4
2  YAIU p.54.lw   4
3  CHUR n.51.kx   6
4  EPGX n.14.lg   3
5  POBJ n.11.ja   5
6  LEWI n.72.un   7
7  WLAP n.20.ve  10
8  XZUY p.75.cf   6
9  ZSNJ  p.4.aj   3
10 ABKR n.69.ua   3
Run Code Online (Sandbox Code Playgroud)

extra = "merge" 获取您定义的列之外的所有额外部分,并将它们合并到最后一列.