我正在使用类似于下面创建的vecA的矢量:
vecA <- c("data2002", "valueA2002", "value2005", "indicator2008/2009",
"something2011/12", "abc2011/14")
我想使用以下格式的vecB:
vecA <- c("data_2002", "valueA_2002", "value_2005", "indicator_2008/2009",
"something_2011/12", "abc_2011/14")
总之,_
时间序列标识符之前有一个下划线,但是奇怪的是可以构造后者。时间序列标识符的唯一共同特征是它以20开头。没有其他共同特征,时间序列标识符可能是:
我想使用regex
与20匹配的模式,而在后面使用负向外观则可以避免匹配20两次。因此,例如在字符串中:
我将从以下内容开始:
gsub(pattern = "20", replacement = "_20",x = names(x))
但这将匹配所有20的实例。所以我的想法是利用正则表达式的行前/后行功能,在此行20(?<!\\2)
中我可以排除比赛中的某些内容。
我们匹配一个或多个非数字元素(\\D+
),将其捕获为组((..)
),然后捕获数字正则表达式超前((?=\\d)
),并替换为反向引用(\\1
),再捕获_
。
sub('(\\D+)(?=\\d)', '\\1_', vecA, perl=TRUE)
#[1] "data_2002" "valueA_2002" "value_2005" "indicator_2008/2009" "something_2011/12" "abc_2011/14"
或者没有环顾四周,我们使用两个捕获组。我们前面提到的第一个捕获组,然后是第二个捕获组,该捕获组以数字开头,然后是一个或多个字符。在替换中,我们使用以分隔的两个反向引用_
。
sub('(\\D+)(\\d.*)', '\\1_\\2', vecA)
如果需要更具体,即仅匹配以开头的数字 20
sub('(\\D+)(20.*)', '\\1_\\2', vecA)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句