dealing with max(na.rm=T) in a mutate statement when grouping by 2 columns slows down by an order by magnitude from version 1.0.0 to 1.0.1
Orders of magnitude difference in time to complete between version 1.0.0 to 1.0.2. When the tibble is very large (thousands or hundreds of thousands of rows) the time explodes. Requires a session restart between installing versions to reproduce the example to ensure the old packages are unloaded and new version is loaded.
library(devtools) library(rstudioapi) #> Loading required package: usethis packageVersion("dplyr") #> [1] '1.0.0' install_version("dplyr", version = "1.0.0", repos = "http://cran.us.r-project.org", upgrade = "never", quiet = TRUE) restartSession()
Created on 2021-01-04 by the reprex package (v0.3.0)
library(tibble) library(dplyr) #> Warning: replacing previous import 'vctrs::data_frame' by #> 'tibble::data_frame' when loading 'dplyr' #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(tictoc) packageVersion('dplyr') #> [1] '1.0.0' df <- tidyr::crossing(tibble(at_date=seq.Date(from = as.Date("2010-01-01"), to = as.Date("2011-01-31"), by = 1), risk_date=lag(at_date,2)) %>% mutate(risk_date=as.Date(ifelse(risk_date==as.Date("2010-01-01"), risk_date, NA), origin = "1970-01-01")), tibble(letters=rep(letters[1:3]))) df <- bind_rows(df, df) %>% arrange(at_date, letters) tic() result <- suppressWarnings(df %>% group_by(at_date, letters) %>% mutate(risk_date=max(risk_date, na.rm=T))) toc() #> 0.154 sec elapsed
Created on 2021-01-04 by the reprex package (v0.3.0)
library(devtools) library(rstudioapi) #> Loading required package: usethis packageVersion("dplyr") #> [1] '1.0.0' install_version("dplyr", version = "1.0.2", repos = "http://cran.us.r-project.org", upgrade = "never", quiet = TRUE) restartSession()
library(tibble) library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(tictoc) packageVersion('dplyr') #> [1] '1.0.2' df <- tidyr::crossing(tibble(at_date=seq.Date(from = as.Date("2010-01-01"), to = as.Date("2011-01-31"), by = 1), risk_date=lag(at_date,2)) %>% mutate(risk_date=as.Date(ifelse(risk_date==as.Date("2010-01-01"), risk_date, NA), origin = "1970-01-01")), tibble(letters=rep(letters[1:3]))) df <- bind_rows(df, df) %>% arrange(at_date, letters) tic() result <- suppressWarnings(df %>% group_by(at_date, letters) %>% mutate(risk_date=max(risk_date, na.rm=T))) toc() #> 2.031 sec elapsed
Created on 2021-01-04 by the reprex package (v0.3.0)