我正在尝试从日期时间中增加和减少几天,但是遇到了一些问题。
可复制示例
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
答案 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
更改为字符类。