有没有一种方法可以在R语言中将两位数的年份转换为四位数的年份?

4
我开始学习r语言。我们需要整理一份数据集。日期列上的日期格式为May_08。该列需要按月份和年份分隔,例如:从May_08到May 2008。以下是我目前的代码。
dataset %>%
  separate(date, c("month","year")) 

5
你得到了一些很好的答案,但作为一般建议:将日期存储为日期类型。即使用as.Dateas.POSIXct读取日期,然后保持不变。只有在需要将其打印出来(或以字符串形式用于其他原因)时,才使用strftimeformat将其转换为所需的格式。这样你可以充分利用R对日期处理的能力(例如绘图、进行日期计算、排序等)。 - dario
6
@akrun,公正地说,考虑到两位数字年份的模糊性,你和jay.sf的回答都足够好。它们都容易受到某些输入的影响。在我看来,我没有看到第一条评论中任何一方存在"社区偏见"(尽管我想知道是否有后续评论已被删除,因此对我不可见)。 - r2evans
@r2evans 我认为两位数的年份总是一个问题,因为存在一些边缘情况,除非OP正确指定,否则某些情况可能会变成19或20。吹毛求疵并在下面发布我的解决方案是可以的,但其他解决方案也存在同样的问题。 - akrun
3个回答

4
你可以使用 strftime,只需在字符串前面粘贴一个日期即可。
x <- "May_08"

strftime(as.Date(paste(1, x), format="%d %b_%y"), "%b %Y")
# [1] "May 2008"

3
@akrun,怎么回事?as.Date(paste(1, "May_33"), format="%d %b_%y") 返回的结果是"2033-05-01",这是否不正确? - r2evans
4
@akrun,我不是在批评你,我是在评论你的“它不会起作用”,或许需要加上“取决于期望结果”的限定词。 - r2evans
6
@akrun,我不是在评论那个问题,而是在评论这个问题。并非每个人都会阅读所有答案和所有答案的所有评论,因此我认为询问这个输入对于这个答案有什么不起作用是公平的。(特别是现在您已经删除了您的回答,以便与它相关的全部上下文都丢失了。) - r2evans

2
您也可以使用lubridate
x <- "May_08"
library(lubridate)
paste(month(parse_date_time(x, "my"), label = T), year(parse_date_time(x, "my")), sep = " ")
# [1] "May 2008"

0
如果您知道在您的系列中,20世纪与21世纪年份之间的分界年份,那么一个简单的ifelse语句就可以解决问题。例如,在这个例子中,1990年是分界年份,所以代码如下:
yrs <- c(91,94,97,00,03,06,09,12,15,18,21)
yrs <- ifelse(yrs>90, yrs+1900, yrs+2000)
> print(yrs)
[1] 1991 1994 1997 2000 2003 2006 2009 2012 2015 2018 2021

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接