R 如何通过数据表中的另一个值向量 replace/gsub 一个值向量
R how to replace/gsub a vector of values by another vector of values in a datatable
我的日期数据格式不能直接使用。我有年度、季度或月经的数据。每年的存储正确,每季度的格式为 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
我们可以使用 grep
和 as.yearqtr
和 as.yearmon
将那些 'date' 元素转换为 Date
class 并进一步将其更改为指定的 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
或者另一个选项是 fcoalecse
和 lubridate
中的 myd
library(lubridate)
MWE[, date := fcoalesce(format(myd(date, truncated = 2), '%d-%m-%Y'), date)]
您可以尝试使用 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
我的日期数据格式不能直接使用。我有年度、季度或月经的数据。每年的存储正确,每季度的格式为 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
我们可以使用 grep
和 as.yearqtr
和 as.yearmon
将那些 'date' 元素转换为 Date
class 并进一步将其更改为指定的 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
或者另一个选项是 fcoalecse
和 lubridate
myd
library(lubridate)
MWE[, date := fcoalesce(format(myd(date, truncated = 2), '%d-%m-%Y'), date)]
您可以尝试使用 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