我试图将一个相当混乱的列分成两列,包含句点和描述.我的数据类似于以下摘录:
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之间的范围内存在的单个字符)可以匹配