данные r.таблица минимум между датами, исключая NA

#r #date #data.table

Вопрос:

как я мог бы получить FinalDate2 правильным и немного более элегантным способом?

 date1 <- c("2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-01")
date2 <- c("2021-01-01","2019-01-01","2020-01-01",NA,NA)
Dates <- as.data.table(cbind(date1,date2))
Dates <- Dates[, date1 := as.Date(as.character(date1), format = "%Y-%m-%d")]
Dates <- Dates[, date2 := as.Date(as.character(date2), format = "%Y-%m-%d")]
Dates <- Dates[, FinalDate1 := ifelse(is.na(date2),date1,pmin(date1,date2))]
Dates <- Dates[, FinalDate2 := as.Date((ifelse(is.na(date2),date1,pmin(date1,date2))),format = "%Y-%m-%d")]
 

Ответ №1:

Ну, вы могли бы начать с того, чтобы убрать все это Dates <- . В этом весь смысл data.table, вы работаете по ссылке, изменяя ее на месте (что исторически совершенно нехорошо).

Но для ответа, na.rm=TRUE возможно, простого, если я правильно понимаю?

 library(lubridate)
library(data.table)

date1 <- ymd(c("2020-01-01","2020-01-01","2020-01-01","2020-01-01","2020-01-01"))
date2 <- ymd(c("2021-01-01","2019-01-01","2020-01-01",NA,NA))
Dates <- data.table( date1, date2 )
Dates[, FinalDate := pmin(date1,date2,na.rm=T)]

 

Ответ №2:

 library( matrixStats )
library( data.table )
#set date1 and date2 to actual dates
#  this replaces line 4 and 5 of your sample code
Dates[, names(Dates) := lapply(.SD, function(x) as.numeric( as.Date(x))) ]
#use matrixStats package for fast rowwise calculations
Dates[, FinalDate2 := rowMins( as.matrix( .SD), na.rm = TRUE ) ][]
#set all to dates again
Dates[, names(Dates) := lapply(.SD, as.Date, origin = "1970-01-01" ) ]

        date1      date2 FinalDate2
1: 2020-01-01 2021-01-01 2020-01-01
2: 2020-01-01 2019-01-01 2019-01-01
3: 2020-01-01 2020-01-01 2020-01-01
4: 2020-01-01       <NA> 2020-01-01
5: 2020-01-01       <NA> 2020-01-01