我想修改日期的日期和年份,但由于闰年的原因,当我按顺序执行这些操作时会遇到一些问题:
newDay = 5
newMonth = 2
dts = as.Date(c('2019-01-01', '2019-02-01', '2019-03-29'))
month(dts) = newMonth
day(dts) = newDay
# [1] "2019-02-05" "2019-02-05" NA
有没有任何方法可以同时访问月份和日期,因此返回:
[1] "2019-02-05" "2019-02-05" "2019-02-05"
如果你不担心月份/日期,只需运行str_replace
,你就可以了:
library(stringr)
dts <- as.Date(c('2019-01-01', '2019-02-01', '2019-03-29'))
print(dts)
library(stringr)
dts <- str_replace(dts, "-..-..", "-02-05")
print(dts)
输出:
# print(dts)
# "2019-01-01" "2019-02-01" "2019-03-29"
#
# print(dts)
# "2019-02-05" "2019-02-05" "2019-02-05"
在base R
中,我们可以使用POSIXlt
类同时更改"月"one_answers"日">
f1 <- function(date, dy, mth) {
new_date <- unclass(as.POSIXlt(date))
new_date[c("mon", "mday")] <- list(rep(mth -1, length(date)),
rep(dy, length(date)))
class(new_date) <- "POSIXlt"
as.Date(new_date)
}
f1(dts, 5, 2)
#[1] "2019-02-05" "2019-02-05" "2019-02-05"
实际上,您不需要真正并行地进行两个操作。代码的一个小变化是将线路交换为day
和month
,例如
f <- function(dts, newM, newD) {
day(dts) <- newD
month(dts) <- newM
dts
}
你会看到
> f(dts, newMonth, newDay)
[1] "2019-02-05" "2019-02-05" "2019-02-05"
dts <- lubridate::make_date(year(dts), 2, 5)