# dplyr 1.0.9
* New `rows_append()` which works like `rows_insert()` but ignores keys and
allows you to insert arbitrary rows with a guarantee that the type of `x`
won't change (#6249, thanks to @krlmlr for the implementation and @mgirlich
for the idea).
* The `rows_*()` functions no longer require that the key values in `x` uniquely
identify each row. Additionally, `rows_insert()` and `rows_delete()` no
longer require that the key values in `y` uniquely identify each row. Relaxing
this restriction should make these functions more practically useful for
data frames, and alternative backends can enforce this in other ways as needed
(i.e. through primary keys) (#5553).
* `rows_insert()` gained a new `conflict` argument allowing you greater control
over rows in `y` with keys that conflict with keys in `x`. A conflict arises
if a key in `y` already exists in `x`. By default, a conflict results in an
error, but you can now also `"ignore"` these `y` rows. This is very similar to
the `ON CONFLICT DO NOTHING` command from SQL (#5588, with helpful additions
from @mgirlich and @krlmlr).
* `rows_update()`, `rows_patch()`, and `rows_delete()` gained a new `unmatched`
argument allowing you greater control over rows in `y` with keys that are
unmatched by the keys in `x`. By default, an unmatched key results in an
error, but you can now also `"ignore"` these `y` rows (#5984, #5699).
* `rows_delete()` no longer requires that the columns of `y` be a strict subset
of `x`. Only the columns specified through `by` will be utilized from `y`,
all others will be dropped with a message.
* The `rows_*()` functions now always retain the column types of `x`. This
behavior was documented, but previously wasn't being applied correctly
(#6240).
* The `rows_*()` functions now fail elegantly if `y` is a zero column data frame
and `by` isn't specified (#6179).
# dplyr 1.0.8
* Better display of error messages thanks to rlang 1.0.0.
* `mutate(.keep = "none")` is no longer identical to `transmute()`.
`transmute()` has not been changed, and completely ignores the column ordering
of the existing data, instead relying on the ordering of expressions
supplied through `...`. `mutate(.keep = "none")` has been changed to ensure
that pre-existing columns are never moved, which aligns more closely with the
other `.keep` options (#6086).
* `filter()` forbids matrix results (#5973) and warns about data frame
results, especially data frames created from `across()` with a hint
to use `if_any()` or `if_all()`.
* `slice()` helpers (`slice_head()`, `slice_tail()`, `slice_min()`, `slice_max()`)
now accept negative values for `n` and `prop` (#5961).
* `slice()` now indicates which group produces an error (#5931).
* `cur_data()` and `cur_data_all()` don't simplify list columns in rowwise data frames (#5901).
* dplyr now uses `rlang::check_installed()` to prompt you whether to install
required packages that are missing.
* `storms` data updated to 2020 (@steveharoz, #5899).
* `coalesce()` accepts 1-D arrays (#5557).
* The deprecated `trunc_mat()` is no longer reexported from dplyr (#6141).
# dplyr 1.0.7
* `across()` uses the formula environment when inlining them (#5886).
* `summarise.rowwise_df()` is quiet when the result is ungrouped (#5875).
* `c_across()` and `across()` key deparsing not confused by long calls (#5883).
* `across()` handles named selections (#5207).
# dplyr 1.0.6
* `add_count()` is now generic (#5837).
* `if_any()` and `if_all()` abort when a predicate is mistakingly used
as `.cols=` (#5732).
* Multiple calls to `if_any()` and/or `if_all()` in the same
expression are now properly disambiguated (#5782).
* `filter()` now inlines `if_any()` and `if_all()` expressions. This
greatly improves performance with grouped data frames.
* Fixed behaviour of `...` in top-level `across()` calls (#5813, #5832).
* `across()` now inlines lambda-formulas. This is slightly more performant and
will allow more optimisations in the future.
* Fixed issue in `bind_rows()` causing lists to be incorrectly transformed as
data frames (#5417, #5749).
* `select()` no longer creates duplicate variables when renaming a variable
to the same name as a grouping variable (#5841).
* `dplyr_col_select()` keeps attributes for bare data frames (#5294, #5831).
* Fixed quosure handling in `dplyr::group_by()` that caused issues with extra
arguments (tidyverse/lubridate#959).
* Removed the `name` argument from the `compute()` generic (@ianmcook, #5783).
* row-wise data frames of 0 rows and list columns are supported again (#5804).
# dplyr 1.0.5
* Fixed edge case of `slice_sample()` when `weight_by=` is used and there
0 rows (#5729).
* `across()` can again use columns in functions defined inline (#5734).
* Using testthat 3rd edition.
* Fixed bugs introduced in `across()` in previous version (#5765).
* `group_by()` keeps attributes unrelated to the grouping (#5760).
* The `.cols=` argument of `if_any()` and `if_all()` defaults to `everything()`.
# dplyr 1.0.4
* Improved performance for `across()`. This makes `summarise(across())` and
`mutate(across())` perform as well as the superseded colwise equivalents (#5697).
* New functions `if_any()` and `if_all()` (#4770, #5713).
* `summarise()` silently ignores NULL results (#5708).
* Fixed a performance regression in `mutate()` when warnings occur once per
group (#5675). We no longer instrument warnings with debugging information
when `mutate()` is called within `suppressWarnings()`.
# dplyr 1.0.3
* `summarise()` no longer informs when the result is ungrouped (#5633).
* `group_by(.drop = FALSE)` preserves ordered factors (@brianrice2, #5545).
* `count()` and `tally()` are now generic.
* Removed default fallbacks to lazyeval methods; this will yield
better error messages when you call a dplyr function with the wrong
input, and is part of our long term plan to remove the deprecated
lazyeval interface.
* `inner_join()` gains a `keep` parameter for consistency with the other
mutating joins (@patrickbarks, #5581).
* Improved performance with many columns, with a dynamic data mask using active
bindings and lazy chops (#5017).
* `mutate()` and friends preserves row names in data frames once more (#5418).
* `group_by()` uses the ungrouped data for the implicit mutate step (#5598).
You might have to define an `ungroup()` method for custom classes.
For example, see https://github.com/hadley/cubelyr/pull/3.
* `relocate()` can rename columns it relocates (#5569).
* `distinct()` and `group_by()` have better error messages when the
mutate step fails (#5060).
* Clarify that `between()` is not vectorised (#5493).
* Fixed `across()` issue where data frame columns would could not be referred to
with `all_of()` in the nested case (`mutate()` within `mutate()`) (#5498).
* `across()` handles data frames with 0 columns (#5523).
* `mutate()` always keeps grouping variables, unconditional to `.keep=` (#5582).
* dplyr now depends on R 3.3.0
# dplyr 1.0.2
* Fixed `across()` issue where data frame columns would mask objects referred to
from `all_of()` (#5460).
* `bind_cols()` gains a `.name_repair` argument, passed to
`vctrs::vec_cbind()` (#5451)
* `summarise(.groups = "rowwise")` makes a rowwise data frame even if
the input data is not grouped (#5422).
# dplyr 1.0.1
* New function `cur_data_all()` similar to `cur_data()` but includes
the grouping variables (#5342).
* `count()` and `tally()` no longer automatically weights by column `n` if
present (#5298). dplyr 1.0.0 introduced this behaviour because of Hadley's
faulty memory. Historically `tally()` automatically weighted and `count()`
did not, but this behaviour was accidentally changed in 0.8.2 (#4408) so that
neither automatically weighted by `n`. Since 0.8.2 is almost a year old,
and the automatically weighting behaviour was a little confusing anyway,
we've removed it from both `count()` and `tally()`.
Use of `wt = n()` is now deprecated; now just omit the `wt` argument.
* `coalesce()` now supports data frames correctly (#5326).
* `cummean()` no longer has off-by-one indexing problem (@cropgen, #5287).
* The call stack is preserved on error. This makes it possible to `recover()`
into problematic code called from dplyr verbs (#5308).