【问题标题】:Use grep to replace every nth and (n+1)th occurrence with different values in R使用 grep 在 R 中用不同的值替换每第 n 次和第 (n+1) 次出现
【发布时间】:2015-06-23 02:27:16
【问题描述】:

季度数据

> 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

我想用M01替换Q1的第1、4、7等出现,Q1的第2、5、8等出现用M02等等,以产生:

     GEO  month
  3864.6 2000M01
  3864.6 2000M02
  3864.6 2000M03
  3841.3 2000M04
  3841.3 2000M05
  3841.3 2000M06
  3843.0 2000M07

与此最接近的解释是here,似乎使用grep 和反向引用\1 是可行的方法(一个有用的列表是here)。

我试过了,

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

这只会给我

     2000M01M02M03
     2000M01M02M03
     2000M01M02M03

我尝试过其他规范,例如 gsub("(?:Q1)(?:Q1)(?:Q1)", "\\1M01\\2M02\\3M03", df.mon$month),但没有进行任何替换。

我真的不明白(?: ) 命令发生了什么(而且似乎没有必要),而且我不知道 Perl,所以我不知道如何使这个看似简单的替换工作。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    试试

    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 表达式。

    【讨论】:

    • 谢谢。这几乎可以工作。 grep 不会删除字符串末尾的“Q1”。但是使用year &lt;- substr(df.mon$month, 1, 4) 就可以了。但是,paste 命令并不能很好地工作,因为我需要所有月份值都有两位数,即M01M02、...、M12
    • 这适用于我的目的:year &lt;- substr(df.mon$month, 1, 4) month &lt;- paste("M", sprintf("%02d", 1:12), sep="") yearmonth &lt;- paste(year, month, sep="") df.mon$month &lt;- yearmonth。这是有效的,因为我所有的国家级数据都在同一季度开始和结束。总的来说,我仍然有兴趣了解如何实施查找和替换解决方案。
    • 查找和替换是错误的策略,因为以编程方式这不是您正在做的事情。您没有找到特定值并将其替换为另一个特定值。您正在用一组具有不同模式的新值替换一组值。
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2018-03-24
    • 2016-12-02
    • 2021-12-19
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多