-1

我读入了一个 Excel 文件,其中有一列包含日期。在某些行中没有完整的日期,但只给出了年份,例如 2018 年。我在 R 中获得的是

> df$date
[1]    NA    NA 43465 43465 43465 43465  2018    NA 43465 43465 43465 43465

我想将这些行转换为完整日期的日期格式,即在我的示例中,只有行与43465其他行保持原样,即NA应该保留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"不是我所期望的。

> ifelse(df$date == 2018, 2018, as.Date(df$date, origin="1899-12-30"))
[1]    NA    NA 17896 17896 17896 17896  2018    NA 17896 17896 17896 17896

这里错误的输出很明显。

4

2 回答 2

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"))
于 2019-11-06T08:53:07.283 回答
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

您会收到一些关于NAs 的警告消息,如果它困扰您,您可以添加一个额外ifelse的来控制 NA。这里我们使用逻辑 grep 测试来查看是否只有四个数字(一年),然后我们创建一个整数值。这允许您仍然使用诸如><==等数学运算符并保​​留所有信息。

您可以'0000'paste0()通话期间根据数据或用例将其更改为更合适的号码。

于 2019-11-06T13:14:33.843 回答