加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 22:56:32 所属栏目:百科 来源:网络整理
导读:我试图将一个相当混乱的列分成两列,包含句点和描述.我的数据类似于以下摘录: set.seed(1)dta - data.frame(indicator=c("someindicator2001","someindicator2011","some text 20022008","another indicator 2003"),values = runif(n = 4)) 期望的结果 期望
我试图将一个相当混乱的列分成两列,包含句点和描述.我的数据类似于以下摘录:
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之间的范围内存在的单个字符)可以匹配

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读