如果一个日期向量有两位数的年份,mdy()将00到68之间的年份转换为21世纪的年份,将69到99之间的年份转换为20世纪的年份.例如:

library(lubridate)    
mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))

给出以下输出:

Multiple format matches with 5 successes: %m/%d/%y, %m/%d/%Y.
Using date format %m/%d/%y.
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC" "2004-01-02 UTC"

我可以在事后通过从错误的日期中减go 100,将2054年和2068年变成1954年和1968年来解决这个问题.但是,有没有一种更优雅、更不容易出错的方法来解析两位数的日期,以便在解析过程中正确处理它们呢?

Update:在@JoshuaUlrich将我指向strptime之后,我找到了this question,它处理的问题与我的类似,但使用的是base R.

这似乎是对R中日期处理的一个很好的补充,可以在日期解析函数中处理两位数日期的世纪 Select 截止.

推荐答案

下面是一个函数,它允许您执行以下操作:

library(lubridate)
x <- mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))


foo <- function(x, year=1968){
  m <- year(x) %% 100
  year(x) <- ifelse(m > year %% 100, 1900+m, 2000+m)
  x
}

试试看:

x
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x)
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x, 1950)
[1] "1954-01-02 UTC" "1968-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

这里的神奇之处在于使用模运算符%%返回除法的分数部分.所以1968 %% 100得到68.

R相关问答推荐

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

如何根据条件计算时差(天)

如何 bootstrap glm回归、估计95%置信区间并绘制它?

用derrr在R中查找组间的重复项

如何在R中合并和合并多个rabrame?

如何在emmeans中计算连续变量的对比度

在R中使用数据集名称

移除仪表板Quarto中顶盖和车身之间的白色区域

将多列合并为单独的名称—值对

计算两列中满足特定条件连续行之间的平均值

过滤名称以特定字符串开头的文件

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

基于Key->Value数据帧的基因子集相关性提取

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

如何计算增加10米(0.01公里)的行?

根据r中另一个文本列中给定的范围对各列求和

是否可以将线性模型的p值添加到tbl_summary中

避免在图例中显示VLINS组

将仪表板中的值框大小更改为Quarto

我怎么才能把一盘棋变成一盘棋呢?