使用条件语句处理日期

时间:2019-04-25 09:18:03

标签: r

我正在尝试从日期时间中增加和减少几天,但是遇到了一些问题。

可复制示例

df = data.frame(date1=c("2017-07-07", "2017-02-11", "2017-05-22")) 

library(lubridate)
df$date1 <- ymd(df$date1) + years(2)
df$day <- wday(df$date1, label=TRUE)

df$date1 <- as.Date(df$date1, "%Y-%m-%d")
df$day <- as.character(df$day)

数据

       date1 day 
1 2019-07-07 Sun   
2 2019-02-11 Mon       
3 2019-05-22 Wed  

问题

我正在尝试使我的代码以一种方式工作,即当日期为“星期日”时,它将仅复制同一日期。但是,我上面的代码返回“ 18084”而不是“ 2019-07-07”。

有人可以向我解释我的问题在哪里吗?

library(dplyr)
df %>% mutate(newdate = ifelse(day == "Sun", as.Date(as.character(date1), "%Y-%m-%d"), 1))

       date1 day newdate
1 2019-07-07 Sun   18084
2 2019-02-11 Mon       1
3 2019-05-22 Wed       1

1 个答案:

答案 0 :(得分:2)

问题是您试图返回ifelse中两个不同类的对象。如果您检查

str(df)
#'data.frame':  3 obs. of  2 variables:
# $ date1: Date, format: "2019-07-07" "2019-02-11" "2019-05-22"
# $ day  : chr  "Sun" "Mon" "Wed"

因此date1属于“日期”类,而ifelse中的else部分包含1,该数字是数字。因此,现在将它们都带到同一个类中,R就是

as.numeric(as.Date("2019-07-07"))
#[1] 18084

日期在内部始终以数字表示。例如,

as.Date(18084, origin = "1970-01-01") #would give
#[1] "2019-07-07"

您可能需要的是

library(dplyr)
df %>% mutate(newdate = ifelse(day == "Sun", as.character(date1), "1"))

#       date1 day    newdate
#1 2019-07-07 Sun 2019-07-07
#2 2019-02-11 Mon          1
#3 2019-05-22 Wed          1

但是这会将newdate更改为字符类。