在第一个遇到的数字上使用单独的(tidyr)通过dplyr分离色谱柱

时间:2016-01-17 19:17:05

标签: regex r string dplyr tidyr

我试图将一个相当混乱的列分成两列,其中包含 period description 。我的数据类似于下面的摘录:

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

特性

  1. 指标说明在一栏
  2. 数字值(从第一个数字计算第一个数字在第二列中计算)
  3. 代码

    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 (例如: 2 003 2 006)< / em>的

    我想做的事情归结为:

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

2 个答案:

答案 0 :(得分:16)

我认为这可能会这样做。

library(tidyr)
separate(dta, indicator, c("indicator", "period"), "(?<=[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])是一个积极的外观 - 它断言[a-z](匹配a和z之间范围内的单个字符(区分大小写))可以匹配
  • ?按字面意思匹配前面的空格字符,在零到一次之间,尽可能多次匹配,根据需要返回
  • (?=[0-9])是一个积极的前瞻 - 它断言[0-9](匹配0到9之间范围内的单个字符)可以匹配

答案 1 :(得分:1)

您也可以使用unglue::unnest()

dta <- data.frame(indicator=c("someindicator2001", "someindicator2011",
                              "some text 20022008", "another indicator 2003"),
                  values = runif(n = 4))

# remotes::install_github("moodymudskipper/unglue")
library(unglue)
unglue_unnest(dta, indicator, "{indicator}{=\\s*}{period=\\d*}")
#>       values         indicator   period
#> 1 0.43234262     someindicator     2001
#> 2 0.65890900     someindicator     2011
#> 3 0.93576805         some text 20022008
#> 4 0.01934736 another indicator     2003

reprex package(v0.3.0)于2019-09-14创建