在 R 中如何计算日期是否早于日期 X?
In R how to calculate if Date is earlier then date X?
我得到了一个带有日期栏的 DF。我想检查列中的日期是在 2020 年 1 月 1 日之后还是之前。创建一个新列,如果前一列的日期早于 2020 年 1 月 1 日,则插入前一列的日期。
日期格式为 YYYY-MM-DD
开始结束
2020-12-31 2021-01-12
2018-01-02 2020-03-10
2019-04-12 2020-12-04
2020-10-15 2021-03-27
我要:
开始结束 Beginning_2
2020-12-31 2021-01-12 2020-12-31
2018-01-02 2020-03-10 2020-01-01
2019-04-12 2020-12-04 2020-01-01
2020-10-15 2021-03-27 2020-10-15
我写的代码是:
DF$Beginning_2 <- ifelse("2020-01-01" > DF$Beginning,"2020-01-01", DF$Beginning)
我明白了
开始结束 Beginning_2
2020-12-31 2021-01-12 18554
2018-01-02 2020-03-10 2020-01-01
2019-04-12 2020-12-04 2020-01-01
2020-10-15 2021-03-27 18453
我的代码运行一半。它将格式转换为 char。我需要它保持最新状态。我尝试在整个代码中按日期对接,但没有太大变化。最大的变化是大于 2020-01-01 的日期是 NA 而不是“18554”。
如何修复我的代码?
谢谢
您可以使用 pmax
:
DF$Beginning_2 <- pmax(DF$Beginning, as.Date("2020-01-01"))
#DF$Beginning_2 <- pmax(DF$Beginning, "2020-01-01") #Works also
DF
# Beginning End Beginning_2
#1 2020-12-31 2021-01-12 2020-12-31
#2 2018-01-02 2020-03-10 2020-01-01
#3 2019-04-12 2020-12-04 2020-01-01
#4 2020-10-15 2021-03-27 2020-10-15
str(DF)
#'data.frame': 4 obs. of 3 variables:
# $ Beginning : Date, format: "2020-12-31" "2018-01-02" ...
# $ End : Date, format: "2021-01-12" "2020-03-10" ...
# $ Beginning_2: Date, format: "2020-12-31" "2020-01-01" ...
Base R ifelse
会将 return 日期作为数字,您需要将它们转换回日期。
DF$Beginning_2 <- as.Date(ifelse(DF$Beginning > as.Date("2020-01-01"),
DF$Beginning, as.Date("2020-01-01")), origin = '1970-01-01')
您可以使用 dplyr::if_else
来维护日期列的 class。
DF$Beginning_2 <- dplyr::if_else(DF$Beginning > as.Date("2020-01-01"),
DF$Beginning, as.Date("2020-01-01"))
DF
# Beginning End Beginning_2
#1 2020-12-31 2021-01-12 2020-12-31
#2 2018-01-02 2020-03-10 2020-01-01
#3 2019-04-12 2020-12-04 2020-01-01
#4 2020-10-15 2021-03-27 2020-10-15
我得到了一个带有日期栏的 DF。我想检查列中的日期是在 2020 年 1 月 1 日之后还是之前。创建一个新列,如果前一列的日期早于 2020 年 1 月 1 日,则插入前一列的日期。
日期格式为 YYYY-MM-DD
开始结束 2020-12-31 2021-01-12 2018-01-02 2020-03-10 2019-04-12 2020-12-04 2020-10-15 2021-03-27
我要:
开始结束 Beginning_2 2020-12-31 2021-01-12 2020-12-31 2018-01-02 2020-03-10 2020-01-01 2019-04-12 2020-12-04 2020-01-01 2020-10-15 2021-03-27 2020-10-15
我写的代码是: DF$Beginning_2 <- ifelse("2020-01-01" > DF$Beginning,"2020-01-01", DF$Beginning)
我明白了
开始结束 Beginning_2 2020-12-31 2021-01-12 18554 2018-01-02 2020-03-10 2020-01-01 2019-04-12 2020-12-04 2020-01-01 2020-10-15 2021-03-27 18453
我的代码运行一半。它将格式转换为 char。我需要它保持最新状态。我尝试在整个代码中按日期对接,但没有太大变化。最大的变化是大于 2020-01-01 的日期是 NA 而不是“18554”。
如何修复我的代码?
谢谢
您可以使用 pmax
:
DF$Beginning_2 <- pmax(DF$Beginning, as.Date("2020-01-01"))
#DF$Beginning_2 <- pmax(DF$Beginning, "2020-01-01") #Works also
DF
# Beginning End Beginning_2
#1 2020-12-31 2021-01-12 2020-12-31
#2 2018-01-02 2020-03-10 2020-01-01
#3 2019-04-12 2020-12-04 2020-01-01
#4 2020-10-15 2021-03-27 2020-10-15
str(DF)
#'data.frame': 4 obs. of 3 variables:
# $ Beginning : Date, format: "2020-12-31" "2018-01-02" ...
# $ End : Date, format: "2021-01-12" "2020-03-10" ...
# $ Beginning_2: Date, format: "2020-12-31" "2020-01-01" ...
Base R ifelse
会将 return 日期作为数字,您需要将它们转换回日期。
DF$Beginning_2 <- as.Date(ifelse(DF$Beginning > as.Date("2020-01-01"),
DF$Beginning, as.Date("2020-01-01")), origin = '1970-01-01')
您可以使用 dplyr::if_else
来维护日期列的 class。
DF$Beginning_2 <- dplyr::if_else(DF$Beginning > as.Date("2020-01-01"),
DF$Beginning, as.Date("2020-01-01"))
DF
# Beginning End Beginning_2
#1 2020-12-31 2021-01-12 2020-12-31
#2 2018-01-02 2020-03-10 2020-01-01
#3 2019-04-12 2020-12-04 2020-01-01
#4 2020-10-15 2021-03-27 2020-10-15