From 543c864ae79002c8f9088e2f66b88206a2a10c6e Mon Sep 17 00:00:00 2001 From: Romain Francois Date: Mon, 29 Oct 2018 17:37:05 +0100 Subject: [PATCH] unwind, nest_* --- ...10-dplyr-0-8-0-release-candidate.Rmarkdown | 60 ++++++++++++-- ...-10-dplyr-0-8-0-release-candidate.markdown | 75 ++++++++++++++++-- .../timings_summarise_mean.jpeg | Bin 0 -> 54248 bytes 3 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 static/articles/2018-10-dplyr-0-8-0_files/timings_summarise_mean.jpeg diff --git a/content/articles/2018-10-dplyr-0-8-0-release-candidate.Rmarkdown b/content/articles/2018-10-dplyr-0-8-0-release-candidate.Rmarkdown index 47b9a51dd..d5356f519 100644 --- a/content/articles/2018-10-dplyr-0-8-0-release-candidate.Rmarkdown +++ b/content/articles/2018-10-dplyr-0-8-0-release-candidate.Rmarkdown @@ -307,16 +307,64 @@ iris %>% # Performance -TODO: - - some initial results in [this issue](https://github.com/tidyverse/dplyr/issues/3881) +When `summarise()` or `mutate()` use expressions that cannot be handled by +hybrid evaluation, they call back to R from the c++ internals for each group. -# nest_by, nest_join +This is an expensive operation because the expressions have to be evaluated +with extra care, traditionally it meant wrapping the expression in an R `tryCatch()` +before evaluating, but R 3.5.0 has added unwind protection and we exposed that to +Rcpp. Consequently, the cost of evaluating an R expression carefully is lower +than before. -TODO +We ran a benchmark of calculating the means of 10 000 small groups with the +release version of dplyr (0.7.7) and this release candidate with and without +using the unwind protect feature. -# colwise verbs +Just using the `mean()` function would not illustrate the feature, because dplyr would +use hybrid evaluation and never use callbacks to R, so instead we defined a `mean_` +function that has the same body as `base::mean()`, we also compare this to +the expression `sum(x) / n()` because it woudld have been handled by +partial hybrid evaluation in previous versions. -TODO +![](/articles/2018-10-dplyr-0-8-0_files/timings_summarise_mean.jpeg) + +The unwind protect feature gives better performance, however +hybrid evaluation is still very relevant. + +# nest_join + +The `nest_join()` function is the newest addition to the join family. + +```{r} +band_members %>% + nest_join(band_instruments) +``` + +A nest join of `x` and `y` returns all rows and all columns from `x`, plus an additional column +that contains a list of tibbles. Each tibble contains all the rows from `y` that match that row of `x`. +When there is no match, the list column is a 0-row tibble with the same column names and types as `y`. + +`nest_join()` is the most fundamental join since you can recreate the other joins from it: + - `inner_join()` is a `nest_join()` plus an `tidyr::unnest()`. + - `left_join()` is a `nest_join()` plus an `unnest(drop = FALSE)`. + - `semi_join()` is a `nest_join()` plus a `filter()` where you check that every element of data has at least one row. + - `anti_join()` is a `nest_join()` plus a `filter()` where you check every element has zero rows. + +# nest_by + +With the new grouping algorithm, dplyr gains the `nest_by()` function, and +associated `nest_by_at()` and `nest_by_if()` column wise variants. `nest_by()` is +similar to `tidyr::nest()` but focuses on the columns that define the grouping +rather than the columns that are nested. + +```{r} +iris %>% + nest_by(Species) +``` + +# column wise verbs + +Mention `last_col()` and `group_cols()` # Tidy grouping structure diff --git a/content/articles/2018-10-dplyr-0-8-0-release-candidate.markdown b/content/articles/2018-10-dplyr-0-8-0-release-candidate.markdown index c7c68e0c7..22a97d812 100644 --- a/content/articles/2018-10-dplyr-0-8-0-release-candidate.markdown +++ b/content/articles/2018-10-dplyr-0-8-0-release-candidate.markdown @@ -397,16 +397,79 @@ iris %>% # Performance -TODO: - - some initial results in [this issue](https://github.com/tidyverse/dplyr/issues/3881) +When `summarise()` or `mutate()` use expressions that cannot be handled by +hybrid evaluation, they call back to R from the c++ internals for each group. -# nest_by, nest_join +This is an expensive operation because the expressions have to be evaluated +with extra care, traditionally it meant wrapping the expression in an R `tryCatch()` +before evaluating, but R 3.5.0 has added unwind protection and we exposed that to +Rcpp. Consequently, the cost of evaluating an R expression carefully is lower +than before. -TODO +We ran a benchmark of calculating the means of 10 000 small groups with the +release version of dplyr (0.7.7) and this release candidate with and without +using the unwind protect feature. -# colwise verbs +Just using the `mean()` function would not illustrate the feature, because dplyr would +use hybrid evaluation and never use callbacks to R, so instead we defined a `mean_` +function that has the same body as `base::mean()`, we also compare this to +the expression `sum(x) / n()` because it woudld have been handled by +partial hybrid evaluation in previous versions. -TODO +![](/articles/2018-10-dplyr-0-8-0_files/timings_summarise_mean.jpeg) + +The unwind protect feature gives better performance, however +hybrid evaluation is still very relevant. + +# nest_join + +The `nest_join()` function is the newest addition to the join family. + + +```r +band_members %>% + nest_join(band_instruments) +#> Joining, by = "name" +#> # A tibble: 3 x 3 +#> name band band_instruments +#> * +#> 1 Mick Stones +#> 2 John Beatles +#> 3 Paul Beatles +``` + +A nest join of `x` and `y` returns all rows and all columns from `x`, plus an additional column +that contains a list of tibbles. Each tibble contains all the rows from `y` that match that row of `x`. +When there is no match, the list column is a 0-row tibble with the same column names and types as `y`. + +`nest_join()` is the most fundamental join since you can recreate the other joins from it: + - `inner_join()` is a `nest_join()` plus an `tidyr::unnest()`. + - `left_join()` is a `nest_join()` plus an `unnest(drop = FALSE)`. + - `semi_join()` is a `nest_join()` plus a `filter()` where you check that every element of data has at least one row. + - `anti_join()` is a `nest_join()` plus a `filter()` where you check every element has zero rows. + +# nest_by + +With the new grouping algorithm, dplyr gains the `nest_by()` function, and +associated `nest_by_at()` and `nest_by_if()` column wise variants. `nest_by()` is +similar to `tidyr::nest()` but focuses on the columns that define the grouping +rather than the columns that are nested. + + +```r +iris %>% + nest_by(Species) +#> # A tibble: 3 x 2 +#> Species data +#> +#> 1 setosa +#> 2 versicolor +#> 3 virginica +``` + +# column wise verbs + +Mention `last_col()` and `group_cols()` # Tidy grouping structure diff --git a/static/articles/2018-10-dplyr-0-8-0_files/timings_summarise_mean.jpeg b/static/articles/2018-10-dplyr-0-8-0_files/timings_summarise_mean.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5abf0b6ce72c2c6ba47ce2c2f16177678569e1cb GIT binary patch literal 54248 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 literal 0 HcmV?d00001