我读了一个Excel文件,其中一栏包含日期。在某些行中没有完整的日期,但仅给出了年份,例如2018年。 我在R中获得的是
> df$date
[1] NA NA 43465 43465 43465 43465 2018 NA 43465 43465 43465 43465
我想将这些行转换为完整日期的日期格式,即在我的示例中,只有带有43465
的行,而其他行保持原样,即NA
应该保留{{1 }}和NA
应该保持2018
。
我知道我可以按照以下2018
格式转换Excel日期,但是以下两个想法给我错误的输出结果
as.Date(df$date, origin="1899-12-30")
当然> as.Date(df$date, origin="1899-12-30")
[1] NA NA "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31" "1905-07-10" NA "2018-12-31" "2018-12-31" "2018-12-31"
[12] "2018-12-31"
不是我所期望的。
"1905-07-10"
这里的错误输出很明显。
答案 0 :(得分:0)
向量不能具有多个类。您可以在其中包含数字或日期类。一种解决方法是使用字符类,这是最通用的字符类。
x <- c(NA,NA,43465,43465,43465,43465,2018,NA,43465,43465, 43465, 43465)
ifelse(x == 2018, "2018", as.character(as.Date(x, origin="1899-12-30")))
# [1] NA NA "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31" "2018"
# [8] NA "2018-12-31" "2018-12-31" "2018-12-31" "2018-12-31"
但是列表可以有多个类,因此如果可以将数据存储在列表中,我们可以使用lapply
lapply(x, function(y)
if (y == 2018 | is.na(y)) y else as.Date(y, origin="1899-12-30"))
答案 1 :(得分:0)
以@Ronak的答案为基础,可以使用正则表达式确定四位数的数字,然后使用四个尾随零填充。
x <- c(NA,NA,43465,43465,43465,43465,2018,NA,43465,43465, 43465, 43465)
ifelse(grepl('^\\d{4}$', x, perl = TRUE),
as.integer(paste0(x, '0000')),
as.integer(format(as.Date(x, origin='1899-12-30'), '%Y%m%d')))
[1] NA NA 20181231 20181231 20181231 20181231 20180000 NA 20181231 20181231 20181231 20181231
您将收到有关NA
的一些警告消息,如果麻烦,您可以添加一个额外的ifelse
来控制NA。在这里,我们使用逻辑grep测试来查看是否只有四个数字(一年),然后创建一个整数值。这样,您仍可以使用数学运算符,例如>
,<
,==
等,并保留所有信息。
您可以根据数据或用例在'0000'
调用期间将paste0()
更改为更合适的数字。