【问题标题】:R how to replace/gsub a vector of values by another vector of values in a datatableR如何用数据表中的另一个值向量替换/ gsub一个值向量
【发布时间】:2021-03-01 04:20:10
【问题描述】:

我的数据的日期格式不直接可用。我有年度、季度或月经的数据。年度存储正确,季度格式为1Q2010,月度格式为JAN2010。 所以像

library(tidyverse)
library(data.table)

MWE <- data.table(date=c("JAN2020","FEB2020","1Q2020","2020"),
                  value=rnorm(4,2,1))

> MWE
      date     value
1: JAN2020 2.5886057
2: FEB2020 0.5913031
3:  1Q2020 1.6237973
4:    2020 1.4093762

我希望它们采用标准格式。我认为一种可读性强的方法是替换非标准元素,因此要有这些元素:

Date_Brute <- c("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC","1Q","2Q","3Q","4Q")

被这些替换

Date_Standardisee <- c("01-01","01-02","01-03","01-04","01-05","01-06","01-07", "01-08","01-09","01-10","01-11","01-12","01-01","01-04","01-07","01-10")

现在我认为gsub 不适用于向量。我发现this answer 建议使用stingr::str_replace_all,但我无法使其在data.table 中发挥作用。

我愿意使用其他函数将向量替换为另一个向量,但希望避免例如切片数据和使用特定日期讲座函数。

期望的输出:

> MWE
      date     value
1: 01-01-2020 2.5886057
2: 01-02-2020 0.5913031
3: 01-01-2020 1.6237973
4: 2020       1.4093762

【问题讨论】:

    标签: r string gsub stringr


    【解决方案1】:

    您可以尝试使用lubridate::parse_date_time(),它采用候选格式的向量来尝试转换:

    library(lubridate)
    library(data.table)
    
    MWE[, date := parse_date_time(date, orders = c("bY","qY", "Y"))]
    
             date      value
    1: 2020-01-01 -0.4948354
    2: 2020-02-01  1.0227036
    3: 2020-01-01  2.6285688
    4: 2020-01-01  1.9158595
    

    【讨论】:

      【解决方案2】:

      我们可以使用grepas.yearqtras.yearmon 将这些“日期”元素转换为Date 类,并进一步将其更改为指定的format

      library(zoo)
      library(data.table)
      MWE[grep('Q', date), date := format(as.Date(as.yearqtr(date, 
                   '%qQ %Y')), '%d-%m-%Y')]
      MWE[grep("[A-Z]", date), date := format(as.Date(as.yearmon(date)), '%d-%m-%Y')]
      

      -输出

      MWE
      #         date     value
      #1: 01-01-2020 0.8931051
      #2: 01-02-2020 2.9813625
      #3: 01-01-2020 1.1918638
      #4:       2020 2.8001267
      

      或者另一个选项是fcoalecsemyd 来自lubridate

      library(lubridate)
      MWE[, date := fcoalesce(format(myd(date, truncated = 2), '%d-%m-%Y'), date)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-21
        • 2011-04-23
        • 2021-08-05
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        相关资源
        最近更新 更多