R语言:如何生成as.Date类型年份列?解决转换报错问题
问题描述
现有包含Date类型SampleDate列的数据框,基于该列生成年份列时,新列变为字符型;尝试用as.Date()转换该字符型年份列时出现报错:
Error in charToDate(x) : character string is not in a standard unambiguous format
相关代码如下:
a <- structure(list(SampleRowID = c(109, 109, 109, 109, 109, 109), SampleDate = structure(c(15803, 15803, 15803, 15803, 15803, 15803), class = "Date")), class = "data.frame", row.names = c(NA, -6L)) glimpse(a) # $ SampleRowID <dbl> 109, 109, 109, 109, 109, 109 # $ SampleDate <date> 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08 # 添加年份列后变为字符型 a$year <- format(a$SampleDate,"%Y") glimpse(a) # $ SampleRowID <dbl> 109, 109, 109, 109, 109, 109 # $ SampleDate <date> 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08, 2013-04-08 # $ year <chr> "2013", "2013", "2013", "2013", "2013", "2013"
解决方案
1. 直接生成Date类型的年份列
Date类型必须包含年、月、日三个要素,单独的年份(如"2013")不属于标准日期格式。可以将年份补全为当年的第一天,直接生成Date类型列:
a$year_date <- as.Date(paste0(format(a$SampleDate, "%Y"), "-01-01")) glimpse(a$year_date) # <date> 2013-01-01, 2013-01-01, 2013-01-01, 2013-01-01, 2013-01-01, 2013-01-01
2. 生成整数型年份(无需Date类型)
如果仅需要年份数值而非日期格式,推荐用lubridate包的year()函数直接提取整数年份:
library(lubridate) a$year_num <- year(a$SampleDate) glimpse(a$year_num) # <int> 2013, 2013, 2013, 2013, 2013, 2013
也可以用基础R实现:
a$year_num <- as.integer(format(a$SampleDate, "%Y"))
3. 修复字符型年份转Date的报错
已生成的字符型年份列无法直接转换为Date,必须补全月日信息,指定完整的日期格式:
a$year_date <- as.Date(paste0(a$year, "-01-01"))
或者显式指定格式参数:
a$year_date <- as.Date(paste0(a$year, "0101"), format = "%Y%m%d")
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

