我试图将一个相当混乱的列分成两列,其中包含period and 描述。我的数据类似于下面的摘录:
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
特征
- 指标描述在一列中
- 数值(从第一个数字开始计数with第一个数字在第二列)
Code
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:]]"
但它将该列分解为太多列,因为它似乎匹配所有可用数字。
- The
sep = "2*"
也不起作用,因为有时有太多 2(例子:20032006).
我想做的归结为:
- 识别字符串中的第一个数字
- 根据该章程分居。事实上,我也很乐意保留这个特殊的性格。
我想这可能会做到。
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 范围内的单个字符)可以匹配
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)