37

Hey i'm trying to rename some columsn by adding "Last_" with the new version of dplyr but I keep getting this error

Error: `across()` must only be used inside dplyr verbs.

this is my code

data %>% rename(across(everything(), ~paste0("Last_", .)))

dplyr version: v1.0.2

user438383
  • 5,716
  • 8
  • 28
  • 43
Ian.T
  • 1,016
  • 1
  • 9
  • 19

2 Answers2

60

We can use rename_with instead of rename

library(dplyr)   
library(stringr)
data %>%
      rename_with(~str_c("Last_", .), everything())

Reproducible example

data(iris)
head(iris) %>% 
    rename_with(~str_c("Last_", .), .cols = everything())
#  Last_Sepal.Length Last_Sepal.Width Last_Petal.Length Last_Petal.Width Last_Species
#1               5.1              3.5               1.4              0.2       setosa
#2               4.9              3.0               1.4              0.2       setosa
#3               4.7              3.2               1.3              0.2       setosa
#4               4.6              3.1               1.5              0.2       setosa
#5               5.0              3.6               1.4              0.2       setosa
#6               5.4              3.9               1.7              0.4       setosa

According to ?rename

rename() changes the names of individual variables using new_name = old_name syntax; rename_with() renames columns using a function.

and in ?across

across() makes it easy to apply the same transformation to multiple columns, allowing you to use select() semantics inside in summarise() and mutate().

The description says its use within mutate/summarise (and transmute?), and no indication of usage with any other functions i.e. it would fail with select

akrun
  • 874,273
  • 37
  • 540
  • 662
  • thanks, but do you know if it's a problem with dplyr rename function or why it doens't work ? – Ian.T Oct 03 '20 at 20:31
  • 2
    @Ian.T it's just that `across` is used for transformation functions within `summarise/mutate/transmute`. The functionality is not extended with `rename` (may be in the future, not sure because in each release they deprecate and introduce new functions). It is possible though to make the `across` generalizable for each of the tidyverse functions. In the current context, I guess `rename_with` is suitable for these cases – akrun Oct 03 '20 at 20:31
12

From the vignette('colwise') (or see the web version).

"across() doesn’t work with select() or rename() because they already use tidy select syntax; if you want to transform column names with a function, you can use rename_with()."

NelsonGon
  • 13,015
  • 7
  • 27
  • 57
Rtist
  • 3,825
  • 2
  • 31
  • 40