Вместо ifelse
используйте fifelse
library(data.table)
dt[, date_aux := fifelse(date_hist>max(date_hist),ymd(as.Date(max(date_hist),
format = "%Y-%m-%d")),ymd(as.Date(date_hist,format = "%Y-%m-%d")))]
str(dt)
#Classes ‘data.table’ and 'data.frame': 24 obs. of 2 variables:
# $ date_hist: Date, format: "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" ...
# $ date_aux : Date, format: "2018-01-01" "2018-02-01" "2018-03-01" "2018-04-01" ...
с ifelse
, даты преобразуются в режим хранения, т. Е. Цифры c
Если мы проверьте исходный код, именно в последних нескольких строках назначения возникает проблема
...
ans <- test
len <- length(ans)
ypos <- which(test)
npos <- which(!test)
if (length(ypos) > 0L)
ans[ypos] <- rep(yes, length.out = len)[ypos]
if (length(npos) > 0L)
ans[npos] <- rep(no, length.out = len)[npos]
ans
...
На простом примере
v1 <- Sys.Date() - 1:5
v2 <- Sys.Date() + 1:5
ans <- v1 > Sys.Date() - 2 # logical vector
ypos <- which(ans)
npos <- which(!ans)
ans[ypos] <- rep(v2, length.out = length(ans))[ypos] Datess
ans
#[1] 18335 0 0 0 0
назначение класса Date
в логических векторных принуждениях Дата конвертации в numeric