【发布时间】:2017-05-07 09:47:51
【问题描述】:
我有一列充满了包含多个点的字符串。我想将此列分成两列,其中包含第一个点之前和之后的两个子字符串。
即
comb num
UWEA.n.49.sp 3
KYFZ.n.89.kr 5
...
进入
a b num
UWEA n.49.sp 3
KYFZ n.89.kr 5
...
我正在使用来自tidyr 的separate 函数,但无法正确获取正则表达式。我正在尝试使用来自this answer 的正则表达式样式:
foo %>%
separate(comb, into=c('a', 'b'),
sep="([^.]+)\\.(.*)")
因此,a 列应由包含至少一个非点字符的第一个捕获组 ([^.]+) 确定,然后是第一个点,然后是第二个捕获组 (.*) 只匹配后面的任何内容。
然而这似乎不匹配任何东西:
a b num
3
5
这是我的虚拟数据集:
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))
【问题讨论】:
-
当有一个内置函数来分割字符串时,为什么要使用正则表达式? stat.ethz.ch/R-manual/R-devel/library/base/html/strsplit.html
-
除非我遗漏了什么,否则该函数仍然需要
split参数的正则表达式,然后我必须手动将结果设置为两个不同的列。使用 tidyr 的separate函数更简单。 -
foo %>% separate(comb, into = c("a","b"), sep = "(?<=[A-Z])\\.(?=[a-z]+)"). -
这不起作用@RichScriven,a 列是完整的字符串,b 是
。可能是因为该示例需要像 separate不允许的正则表达式之类的 Perl。 @Abdou 有效!如果您将其写成答案并解释?<=和?=的作用,我会接受。