正则表达式 – 使用单独的(tidyr)通过dplyr在第一个遇到的数字上分离列

前端之家收集整理的这篇文章主要介绍了正则表达式 – 使用单独的(tidyr)通过dplyr在第一个遇到的数字上分离列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将一个相当混乱的列分成两列,包含句点和描述.我的数据类似于以下摘录:
set.seed(1)
dta <- data.frame(indicator=c("someindicator2001","someindicator2011","some text 20022008","another indicator 2003"),values = runif(n = 4))

期望的结果

期望的结果应如下所示:

indicator   period    values
1     someindicator     2001 0.2655087
2     someindicator     2011 0.3721239
3         some text 20022008 0.5728534
4 another indicator     2003 0.9082078

特点

>指标描述在一列
>数值(从第一位数字开始计数,位于第二列)

require(dplyr); require(tidyr); require(magrittr)
dta %<>%
  separate(col = indicator,into = c("indicator","period"),sep = "^[^\\d]*(2+)",remove = TRUE)

当然这不行:

> head(dta,2)
  indicator period    values
1              001 0.2655087
2              011 0.3721239

其他尝试

>我还尝试了默认的分离方法sep =“[^ [:alnum:]]”,但是它将列分解成太多列,因为它似乎与所有可用的数字匹配.
> sep =“2 *”也不起作用,因为有太多的2s(例如:20032006).

我要做的是归结为:

>识别字符串中的第一个数字
>根据该章程分开.事实上,我也乐意保留这个特定的角色.

我认为这可能会这样做.
library(tidyr)
separate(dta,indicator,c("indicator","(?<=[a-z]) ?(?=[0-9])")
#           indicator   period    values
# 1     someindicator     2001 0.2655087
# 2     someindicator     2011 0.3721239
# 3         some text 20022008 0.5728534
# 4 another indicator     2003 0.9082078

以下是regex101给您的正则表达式的解释.

(α<= [a-z])是正的lookbehind - 它断言[a-z](匹配a和z(区分大小写)之间的范围内存在的单个字符)可以匹配>?匹配前面的空格字符,在零和一次之间,尽可能多的次数,根据需要回复>(?= [0-9])是一个积极的前瞻 – 它断言[0-9](匹配在0和9之间的范围内存在的单个字符)可以匹配

猜你在找的正则表达式相关文章