tidyr 1.2.0
Pivoting
-
pivot_wider()
gains newnames_expand
andid_expand
arguments for turning
implicit missing factor levels and variable combinations into explicit ones.
This is similar to thedrop
argument fromspread()
(#770). -
pivot_wider()
gains a newnames_vary
argument for controlling the
ordering when combiningnames_from
values withvalues_from
column names
(#839). -
pivot_wider()
gains a newunused_fn
argument for controlling how to
summarize unused columns that aren't involved in the pivoting process (#990,
thanks to @mgirlich for an initial implementation). -
pivot_longer()
'snames_transform
andvalues_transform
arguments now
accept a single function which will be applied to all of the columns
(#1284, thanks to @smingerson for an initial implementation). -
pivot_longer()
'snames_ptypes
andvalues_ptypes
arguments now
accept a single empty ptype which will be applied to all of the columns
(#1284).
Nesting
-
unnest()
andunchop()
'sptype
argument now accepts a single empty
ptype which will be applied to allcols
(#1284). -
unpack()
now silently skips over any non-data frame columns specified by
cols
. This matches the existing behavior ofunchop()
andunnest()
(#1153).
Rectangling
-
unnest_wider()
andunnest_longer()
can now unnest multiple columns at
once (#740). -
unnest_longer()
'sindices_to
andvalues_to
arguments now accept
a glue specification, which is useful when unnesting multiple columns. -
For
hoist()
,unnest_longer()
, andunnest_wider()
, if aptype
is
supplied, but that column can't be simplified, the result will be a list-of
column where each element has typeptype
(#998). -
unnest_wider()
gains a newstrict
argument which controls whether or not
strict vctrs typing rules should be applied. It defaults toFALSE
for
backwards compatibility, and because it is often more useful to be lax
when unnesting JSON, which doesn't always map one-to-one with R's types
(#1125). -
hoist()
,unnest_longer()
, andunnest_wider()
'ssimplify
argument now
accepts a named list ofTRUE
orFALSE
to control simplification on a per
column basis (#995). -
hoist()
,unnest_longer()
, andunnest_wider()
'stransform
argument now
accepts a single function which will be applied to all components (#1284). -
hoist()
,unnest_longer()
, andunnest_wider()
'sptype
argument now
accepts a single empty ptype which will be applied to all components (#1284).
Grids
-
complete()
gains a newexplicit
argument for limitingfill
to only
implicit missing values. This is useful if you don't want to fill in
pre-existing missing values (#1270). -
complete()
gains a grouped data frame method. This generates a more correct
completed data frame when groups are involved (#396, #966). -
complete()
andexpand()
no longer allow you to complete or expand on a
grouping column. This was never well-defined since completion/expansion on a
grouped data frame happens "within" each group and otherwise has the
potential to produce erroneous results (#1299).
Missing values
-
drop_na()
,replace_na()
, andfill()
have been updated to utilize vctrs.
This means that you can use these functions on a wider variety of column
types, including lubridate's Period types (#1094), data frame columns, and
the rcrd type from vctrs. -
replace_na()
no longer allows the type ofdata
to change when the
replacement is applied.replace
will now always be cast to the type of
data
before the replacement is made. For example, this means that using a
replacement value of1.5
on an integer column is no longer allowed.
Similarly, replacing missing values in a list-column must now be done with
list("foo")
rather than just"foo"
. -
replace_na()
no longer replaces empty atomic elements in list-columns
(likeinteger(0)
). The only value that is replaced in a list-column is
NULL
(#1168). -
drop_na()
no longer drops empty atomic elements from list-columns
(likeinteger(0)
). The only value that is dropped in a list-column is
NULL
(#1228).
Bug fixes and minor improvements
General
-
@mgirlich is now a tidyr author in recognition of his significant and
sustained contributions. -
All lazyeval variants of tidyr verbs have been soft-deprecated. Expect them
to move to the defunct stage in the next minor release of tidyr (#1294). -
any_of()
andall_of()
from tidyselect are now re-exported (#1217). -
dplyr >= 1.0.0 is now required.
Pivoting
-
pivot_wider()
now gives better advice about how to identify duplicates when
values are not uniquely identified (#1113). -
pivot_wider()
now throws a more informative error whenvalues_fn
doesn't
result in a single summary value (#1238). -
pivot_wider()
andpivot_longer()
now generate more informative
errors related to name repair (#987). -
pivot_wider()
now works correctly whenvalues_fill
is a data frame. -
pivot_wider()
no longer accidentally retainsvalues_from
when pivoting
a zero row data frame (#1249). -
pivot_wider()
now correctly handles the case where an id column name
collides with a value fromnames_from
(#1107). -
pivot_wider()
andpivot_longer()
now both check that the spec columns
.name
and.value
are character vectors. Additionally, the.name
column must be unique (#1107). -
pivot_wider()
'snames_from
andvalues_from
arguments are now
required if their default values ofname
andvalue
don't correspond to
columns indata
. Additionally, they must identify at least 1 column
indata
(#1240). -
pivot_wider()
'svalues_fn
argument now correctly allows anonymous
functions (#1114). -
pivot_wider_spec()
now works correctly with a 0-row data frame and aspec
that doesn't identify any rows (#1250, #1252). -
pivot_longer()
'snames_ptypes
argument is now applied after
names_transform
for consistency with the rectangling functions
(i.e.hoist()
) (#1233). -
check_pivot_spec()
is a new developer facing function for validating a pivot
spec
argument. This is only useful if you are extendingpivot_longer()
or
pivot_wider()
with new S3 methods (#1087).
Nesting
-
The
nest()
generic now avoids computing on.data
, making it more
compatible with lazy tibbles (#1134). -
The
.names_sep
argument of the data.frame method fornest()
is now
actually used (#1174). -
unnest()
'sptype
argument now works as expected (#1158). -
unpack()
no longer drops empty columns specified throughcols
(#1191). -
unpack()
now works correctly with data frame columns containing 1 row but
0 columns (#1189). -
chop()
now works correctly with data frames with 0 rows (#1206). -
chop()
'scols
argument is no longer optional. This matches the
behavior ofcols
seen elsewhere in tidyr (#1205). -
unchop()
now respectsptype
when unnesting a non-list column (#1211).
Rectangling
hoist()
no longer accidentally removes elements that have duplicated names
(#1259).
Grids
-
The grouped data frame methods for
complete()
andexpand()
now move the
group columns to the front of the result (in addition to the columns you
completed on or expanded, which were already moved to the front). This should
make more intuitive sense, as you are completing or expanding "within" each
group, so the group columns should be the first thing you see (#1289). -
complete()
now appliesfill
even when no columns to complete are
specified (#1272). -
expand()
,crossing()
, andnesting()
now correctly retainNA
values of
factors (#1275). -
expand_grid()
,expand()
,nesting()
, andcrossing()
now silently
apply name repair to automatically named inputs. This avoids a number of
issues resulting from duplicate truncated names
(#1116, #1221, #1092, #1037, #992). -
expand_grid()
,expand()
,nesting()
, andcrossing()
now allow
columns from unnamed data frames to be used in expressions after that
data frame was specified, likeexpand_grid(tibble(x = 1), y = x)
. This
is more consistent with howtibble()
behaves. -
expand_grid()
,expand()
,nesting()
, andcrossing()
now work
correctly with data frames containing 0 columns but >0 rows (#1189). -
expand_grid()
,expand()
,nesting()
, andcrossing()
now return a 1
row data frame when no inputs are supplied, which is more consistent with
prod() == 1L
and the idea that computations involving the number of
combinations computed from an empty set should return 1 (#1258).