簡體   English   中英

在第一個遇到的數字上使用單獨的(tidyr)通過dplyr分離色譜柱

[英]Separating column using separate (tidyr) via dplyr on a first encountered digit

我正在嘗試將一個相當混亂的列分成兩列,其中包含句點描述 我的數據類似於下面的摘錄:

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. 數值( 第一個數字從第一個數字計數是在第二列)

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)

我想要做的是歸結為:

  • 識別字符串中的第一個數字
  • 分離該章程。 事實上,我也很樂意保留這個特殊的角色。

我想這可能會這樣做。

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為您提供的正則表達式的說明。

  • (?<=[az])是一個正面的背后 - 它斷言[az] (匹配a和z之間范圍內的單個字符(區分大小寫))可以匹配
  • ? 在字面上匹配前面的空格字符,在零到一次之間,盡可能多次,根據需要返回
  • (?=[0-9])是一個正向前瞻 - 它斷言[0-9] (匹配0到9之間范圍內的單個字符)可以匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM