pick {dplyr} | R Documentation |
Select a subset of columns
Description
pick()
provides a way to easily select a subset of columns from your data
using select()
semantics while inside a
"data-masking" function like mutate()
or
summarise()
. pick()
returns a data frame containing the selected columns
for the current group.
pick()
is complementary to across()
:
With
pick()
, you typically apply a function to the full data frame.With
across()
, you typically apply a function to each column.
Usage
pick(...)
Arguments
... |
Columns to pick. You can't pick grouping columns because they are already automatically
handled by the verb (i.e. |
Details
Theoretically, pick()
is intended to be replaceable with an equivalent call
to tibble()
. For example, pick(a, c)
could be replaced with
tibble(a = a, c = c)
, and pick(everything())
on a data frame with cols
a
, b
, and c
could be replaced with tibble(a = a, b = b, c = c)
.
pick()
specially handles the case of an empty selection by returning a 1
row, 0 column tibble, so an exact replacement is more like:
size <- vctrs::vec_size_common(..., .absent = 1L) out <- vctrs::vec_recycle_common(..., .size = size) tibble::new_tibble(out, nrow = size)
Value
A tibble containing the selected columns for the current group.
See Also
Examples
df <- tibble(
x = c(3, 2, 2, 2, 1),
y = c(0, 2, 1, 1, 4),
z1 = c("a", "a", "a", "b", "a"),
z2 = c("c", "d", "d", "a", "c")
)
df
# `pick()` provides a way to select a subset of your columns using
# tidyselect. It returns a data frame.
df %>% mutate(cols = pick(x, y))
# This is useful for functions that take data frames as inputs.
# For example, you can compute a joint rank between `x` and `y`.
df %>% mutate(rank = dense_rank(pick(x, y)))
# `pick()` is also useful as a bridge between data-masking functions (like
# `mutate()` or `group_by()`) and functions with tidy-select behavior (like
# `select()`). For example, you can use `pick()` to create a wrapper around
# `group_by()` that takes a tidy-selection of columns to group on. For more
# bridge patterns, see
# https://rlang.r-lib.org/reference/topic-data-mask-programming.html#bridge-patterns.
my_group_by <- function(data, cols) {
group_by(data, pick({{ cols }}))
}
df %>% my_group_by(c(x, starts_with("z")))
# Or you can use it to dynamically select columns to `count()` by
df %>% count(pick(starts_with("z")))