简体   繁体   中英

Is there an elegant tidyverse method for renaming columns en masse?

I'm working with a small dataset built from a Google Form. The column names are the full survey questions eg.

"1. What team most describes your work?"
"2. Are you a manager?"
"3. How long have you been with x?"

I want to rename all of these columns "1", "2", "3" etc. I know that I can do the below, but I'm hoping there's a more elegant/quicker way. There are 23 columns like this.

survey %>% rename_with(
  `1` = `1. What team most describes your work?`,
  `2` = `2. Are you a manager?`...

This works, but is slow to compose. Anyone have anything better in tidyverse? I'm new to R and coding generally, so any tips appreciated.

You can supply multiple columns in rename_with(.cols = your_columns) , and use a function to apply to the selected columns. Here, the question number (the digit before the dot) is captured ( (\\d+) ) and the whole column name is replaced by that digit (regex capture group 1 \\1 ).

If you omit the .cols argument, all columns will be selected by default.

library(dplyr)

# dummy df
df <- tibble("1. What team most describes your work?" = "1",
             "2. Are you a manager?" = "2",
             "3. How long have you been with x?" = "3")

df %>% rename_with(~sub("(\\d+)\\..*$", "\\1", .x))

# A tibble: 1 × 3
  `1`   `2`   `3`  
  <chr> <chr> <chr>
1 1     2     3    

There are more concise solutions possible. One of them is with str_extract :

library(stringr)
df %>% rename_with(~str_extract(., "\\d+"))

Here we extract the first digit in the names strings.

Another is with str_remove :

df %>% rename_with(~str_remove(., "\\..*"))

Here we remove anything from the period onwards.

Data (thanks to @benson):

df <- tibble("1. What team most describes your work?" = "1",
             "2. Are you a manager?" = "2",
             "3. How long have you been with x?" = "3")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM