2

Here's an example

temp <- mtcars
colnames(temp)[grepl("ge", colnames(temp))] <- "garbage"

Output

                     mpg cyl  disp  hp drat    wt  qsec vs am garbage carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1       4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1       4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1       4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0       3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0       3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0       3    1

I only know what the column name will start with ("ge") but I'm not sure of the column name exactly

I want a solution that works in a dplyr chain

temp %>%
   rename(vars(starts_with("ge")), "garbage")
Error: All arguments must be named

of course doesn't work. Thanks for any help

CPak
  • 13,260
  • 3
  • 30
  • 48

1 Answers1

6

You can use rename_at. If you know that only one column starts with "ge", this will work:

library(dplyr)
mtcars %>% 
  rename_at(vars(starts_with("ge")), funs(paste0("garbage")))

If you want to rename more than one column, the function in funs() needs to return a vector of names, or do something like gsub() to add something to the existing column names.

neilfws
  • 32,751
  • 5
  • 50
  • 63
  • Awesome, thanks! Didn't realize it existed (in addition to the other `verb_at`s.) And how you got it accept an argument doesn't make a lot of sense but that's probably how it was designed. – CPak Sep 19 '17 at 00:50
  • I find the syntax for the `_all`, `_if` and `_at` variants quite confusing myself. There must be a good tutorial somewhere! – neilfws Sep 19 '17 at 00:56
  • Nice answer, but it's a bit odd that you have to provide a function to specify a replacement character string. – thelatemail Sep 19 '17 at 00:57
  • I'm sure there's a cleaner, cleverer way. I tried it, it worked :) – neilfws Sep 19 '17 at 00:59
  • 1
    For renaming single column, an alternatively solution is `mtcars %>% rename_at(vars(starts_with("ge")), ~"garbage")`. For why this works, see comments here: https://stackoverflow.com/a/44452676/3926543. – mt1022 Sep 19 '17 at 01:09
  • @mt1022 - I'm on an older version of dplyr at the moment - does that expand to multiple columns if I put a vector in place of `"garbage"` ? – thelatemail Sep 19 '17 at 01:16
  • 1
    @thelatemail, something like `mtcars %>% rename_at(vars(starts_with("d")), ~c("d1", "d2"))`? Sure, this also works. I would prefer `mtcars %>% rename_at(vars(starts_with("d")), ~rep("grabage", length(.)))` – mt1022 Sep 19 '17 at 01:21
  • Thanks @mt1022 for the link as well – CPak Sep 19 '17 at 01:25
  • What is `vars` in this context? I can't see where this comes from? – Michael Barton Oct 23 '17 at 18:51
  • @MichaelBarton `vars()` is a `dplyr` function (see `?vars`). It is not so well documented. – neilfws Oct 23 '17 at 20:25