The functions map_if()
and map_at()
take .x
as input, apply
the function .f
to some of the elements of .x
, and return a
list of the same length as the input.
map_if()
takes a predicate function.p
as input to determine which elements of.x
are transformed with.f
.map_at()
takes a vector of names or positions.at
to specify which elements of.x
are transformed with.f
.
Arguments
- .x
A list or atomic vector.
- .p
A single predicate function, a formula describing such a predicate function, or a logical vector of the same length as
.x
. Alternatively, if the elements of.x
are themselves lists of objects, a string indicating the name of a logical element in the inner lists. Only those elements where.p
evaluates toTRUE
will be modified.- .f
A function, specified in one of the following ways:
A named function, e.g.
mean
.An anonymous function, e.g.
\(x) x + 1
orfunction(x) x + 1
.A formula, e.g.
~ .x + 1
. You must use.x
to refer to the first argument. Only recommended if you require backward compatibility with older versions of R.A string, integer, or list, e.g.
"idx"
,1
, orlist("idx", 1)
which are shorthand for\(x) pluck(x, "idx")
,\(x) pluck(x, 1)
, and\(x) pluck(x, "idx", 1)
respectively. Optionally supply.default
to set a default value if the indexed element isNULL
or does not exist.
- ...
Additional arguments passed on to the mapped function.
We now generally recommend against using
...
to pass additional (constant) arguments to.f
. Instead use a shorthand anonymous function:This makes it easier to understand which arguments belong to which function and will tend to yield better error messages.
- .else
A function applied to elements of
.x
for which.p
returnsFALSE
.- .at
A logical, integer, or character vector giving the elements to select. Alternatively, a function that takes a vector of names, and returns a logical, integer, or character vector of elements to select.
: if the tidyselect package is installed, you can use
vars()
and tidyselect helpers to select elements.- .progress
Whether to show a progress bar. Use
TRUE
to turn on a basic progress bar, use a string to give it a name, or see progress_bars for more details.
Examples
# Use a predicate function to decide whether to map a function:
iris |> map_if(is.factor, as.character) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#> $ Species : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
# Specify an alternative with the `.else` argument:
iris |> map_if(is.factor, as.character, .else = as.integer) |> str()
#> List of 5
#> $ Sepal.Length: int [1:150] 5 4 4 4 5 5 4 5 4 4 ...
#> $ Sepal.Width : int [1:150] 3 3 3 3 3 3 3 3 2 3 ...
#> $ Petal.Length: int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
#> $ Petal.Width : int [1:150] 0 0 0 0 0 0 0 0 0 0 ...
#> $ Species : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...
# Use numeric vector of positions select elements to change:
iris |> map_at(c(4, 5), is.numeric) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : logi TRUE
#> $ Species : logi FALSE
# Use vector of names to specify which elements to change:
iris |> map_at("Species", toupper) |> str()
#> List of 5
#> $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#> $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#> $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#> $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#> $ Species : chr [1:150] "SETOSA" "SETOSA" "SETOSA" "SETOSA" ...