У меня есть data.table
require(data.table)
require(lubridate)
testDT <- data.table(dateA = c(NA,NA), dateB = c(ymd("20110101"),ymd("20100101")))
testDT
# dateA dateB
# 1: NA 2011-01-01
# 2: NA 2010-01-01
Я хотел бы сделать следующую операцию: если dateA - NA, используйте то же значение, что и в dateB. Я пробовал следующую команду:
> testDT[is.na(dateA), dateA := dateB]
Warning message:
In `[.data.table`(testDT, is.na(dateA), `:=`(dateA, dateB)) :
Coerced 'double' RHS to 'logical' to match the column's type; may have truncated precision. Either change the target column ['dateA'] to 'double' first (by creating a new 'double' vector length 2 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'logical' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.
Как видите, появилось предупреждение, и результат странный:
> testDT
dateA dateB
1: TRUE 2011-01-01
2: TRUE 2010-01-01
Почему это не работает?
P.S. Я знаю, что мы можем использовать:
> testDT[,dateA := ifelse(is.na(dateA), dateB, dateA)]
> testDT
dateA dateB
1: 14975 2011-01-01
2: 14610 2010-01-01
> testDT[,dateA := as.Date(dateA, origin = "1970-01-01")]
> testDT
dateA dateB
1: 2011-01-01 2011-01-01
2: 2010-01-01 2010-01-01