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)
在这种情况下,您可以利用该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" 获取您定义的列之外的所有额外部分,并将它们合并到最后一列.