使用grep将每个第n个和第(n + 1)个匹配项替换为R中的不同值

时间:2015-04-16 15:06:43

标签: r string replace grep

季度数据

> df  
  TIME     GEO  Value
2000Q1 Austria 3864.6   
2000Q2 Austria 3841.3   
2000Q3 Austria 3843.0   
2000Q4 Austria 3847.2   
2001Q1 Austria 3853.5   
2001Q2 Austria 3875.2   
2001Q3 Austria 3886.7  
2001Q4 Austria 3921.9   
2002Q1 Austria 3865.2   
2002Q2 Austria 3872.4  
2002Q3 Austria 3876.0  
2002Q4 Austria 3887.9   
2003Q1 Austria 3938.3   
2003Q2 Austria 3954.5  
2003Q3 Austria 3972.8  
2003Q4 Austria 3971.9  

我天真地将季度数据转换为每月数据 df.mon <- rep(df$Value, each=3)。我为df$TIME

做了同样的事情
 df.mon$TIME <- rep(df$TIME, each=3)  

我想将这些时间标识符转换为每月标识符,以便我可以轻松地使用df.mon作为每月数据的权重。

所以,我有

  >head(df.mon, n=10)
     GEO  month
  3864.6 2000Q1
  3864.6 2000Q1
  3864.6 2000Q1
  3841.3 2000Q2
  3841.3 2000Q2
  3841.3 2000Q2
  3843.0 2000Q3
  3843.0 2000Q3
  3843.0 2000Q3
  3847.2 2000Q4

我想用Q1替换M01的第1,第4,第7等出现,用{{1}替换Q1的第2,第5,第8等出现等等,生成:

M02

对此最近的解释是here,似乎使用 GEO month 3864.6 2000M01 3864.6 2000M02 3864.6 2000M03 3841.3 2000M04 3841.3 2000M05 3841.3 2000M06 3843.0 2000M07 后退引用grep是可行的方法(有用的列表是here)。< / p>

我已经尝试了,

\1

只给了我

gsub("(?:Q1)", "\\1M01\\2M02\\3M03", df.mon$month)

我已经尝试了其他规范,例如 2000M01M02M03 2000M01M02M03 2000M01M02M03 ,但没有替换。

我真的不明白gsub("(?:Q1)(?:Q1)(?:Q1)", "\\1M01\\2M02\\3M03", df.mon$month)命令发生了什么(似乎没必要),而且我也不了解Perl,所以我在如何使这看似容易的替换工作失去了。

1 个答案:

答案 0 :(得分:0)

尝试

year <- grep("[0-9]{4}", df.mon$month, value=T)
month <- paste("M", 1:12, sep="")
yearmonth <- paste(year, month, sep="")
df.mon$month <- yearmonth

不需要复杂的reg表达式。