Home > other >  Parsing string as column name in dplyr
Parsing string as column name in dplyr

Time:03-09

I need to pass a string as a column name using dplyr (code below). I can't get it to work. I've tried using [[name]] and .data[[name]] and this doesn't work. I need a solution specifically that allows me to rename a column as the string I've specified in the variable name.

colnames(mtcars) -> cols

rename_cols <- function(col) {
  
  name = paste0(col, "_new") #I want to be able to parse this into the rename function below

  mtcars %>% 
    rename(
      name = col,
    )
}

lapply(cols, rename_cols)

CodePudding user response:

I would use a named vector instead of trying to mess around with the dplyr programming nuances. A benefit is that this method is already vectorized.

rename_cols <- function(col) {
  
  name = paste0(col, "_new") #I want to be able to parse this into the rename function below
  
  mtcars %>% 
    rename(setNames(col, name))
}

rename_cols(colnames(mtcars))
#                     mpg_new cyl_new disp_new hp_new drat_new wt_new qsec_new vs_new am_new gear_new carb_new
# 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
# ...

Edit

In this case, you might also find rename_with() to be what you need.

library(dplyr)

colnames(mtcars) -> cols

mtcars %>% 
  rename_with(~ paste0(., "_new"), any_of(cols))

# which is the same as the more concise but maybe less clear...
mtcars %>% 
  rename_with(paste0, any_of(cols), "_new")

CodePudding user response:

Another option using some glue magic and the := assignment operator:

library(dplyr)

colnames(mtcars) -> cols

rename_cols <- function(col) {
  
  name = paste0(col, "_new") #I want to be able to parse this into the rename function below
  
  mtcars %>% 
    rename(
      "{name}" := col,
    )
}

lapply(cols, rename_cols)[1:2]
#> Note: Using an external vector in selections is ambiguous.
#> ℹ Use `all_of(col)` instead of `col` to silence this message.
#> ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
#> This message is displayed once per session.
#> [[1]]
#>                     mpg_new cyl  disp  hp drat    wt  qsec vs am gear 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
#> Duster 360             14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Merc 240D              24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230               22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Merc 280               19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C              17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Merc 450SE             16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
#> Merc 450SL             17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
#> Merc 450SLC            15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> Cadillac Fleetwood     10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental    10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
#> Chrysler Imperial      14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Fiat 128               32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic            30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla         33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona          21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Dodge Challenger       15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> AMC Javelin            15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Camaro Z28             13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Pontiac Firebird       19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Fiat X1-9              27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2          26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> Lotus Europa           30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#> Ford Pantera L         15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
#> Ferrari Dino           19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#> Maserati Bora          15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
#> Volvo 142E             21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
#> 
#> [[2]]
#>                      mpg cyl_new  disp  hp drat    wt  qsec vs am gear 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
#> Duster 360          14.3       8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Merc 240D           24.4       4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Merc 230            22.8       4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Merc 280            19.2       6 167.6 123 3.92 3.440 18.30  1  0    4    4
#> Merc 280C           17.8       6 167.6 123 3.92 3.440 18.90  1  0    4    4
#> Merc 450SE          16.4       8 275.8 180 3.07 4.070 17.40  0  0    3    3
#> Merc 450SL          17.3       8 275.8 180 3.07 3.730 17.60  0  0    3    3
#> Merc 450SLC         15.2       8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> Cadillac Fleetwood  10.4       8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4       8 460.0 215 3.00 5.424 17.82  0  0    3    4
#> Chrysler Imperial   14.7       8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Fiat 128            32.4       4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic         30.4       4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Toyota Corolla      33.9       4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Toyota Corona       21.5       4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Dodge Challenger    15.5       8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> AMC Javelin         15.2       8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Camaro Z28          13.3       8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Pontiac Firebird    19.2       8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Fiat X1-9           27.3       4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2       26.0       4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> Lotus Europa        30.4       4  95.1 113 3.77 1.513 16.90  1  1    5    2
#> Ford Pantera L      15.8       8 351.0 264 4.22 3.170 14.50  0  1    5    4
#> Ferrari Dino        19.7       6 145.0 175 3.62 2.770 15.50  0  1    5    6
#> Maserati Bora       15.0       8 301.0 335 3.54 3.570 14.60  0  1    5    8
#> Volvo 142E          21.4       4 121.0 109 4.11 2.780 18.60  1  1    4    2

CodePudding user response:

This seems like doing things the hard way: you can replace the whole code with:

mtcars %>% setNames(paste0(cols, "_new"))

Or, if you only want to rename some columns:

names(mtcars[cols]) <- paste0(names(mtcars[cols]), "_new")

If for some reason this isn't what you want, you can turn name into a symbol and use !!name :=

colnames(mtcars) -> cols

rename_cols <- function(col) {
  
  name = paste0(col, "_new") 

  name <- rlang::ensym(name)
  mtcars[col] %>% 
    rename(
      !!name := all_of(col),
    )
}

as.data.frame(lapply(cols, rename_cols))
#>                     mpg_new cyl_new disp_new hp_new drat_new wt_new qsec_new
#> Mazda RX4              21.0       6    160.0    110     3.90  2.620    16.46
#> Mazda RX4 Wag          21.0       6    160.0    110     3.90  2.875    17.02
#> Datsun 710             22.8       4    108.0     93     3.85  2.320    18.61
#> Hornet 4 Drive         21.4       6    258.0    110     3.08  3.215    19.44
#> Hornet Sportabout      18.7       8    360.0    175     3.15  3.440    17.02
#> Valiant                18.1       6    225.0    105     2.76  3.460    20.22
#> Duster 360             14.3       8    360.0    245     3.21  3.570    15.84
#> Merc 240D              24.4       4    146.7     62     3.69  3.190    20.00
#> Merc 230               22.8       4    140.8     95     3.92  3.150    22.90
#> Merc 280               19.2       6    167.6    123     3.92  3.440    18.30
#> Merc 280C              17.8       6    167.6    123     3.92  3.440    18.90
#> Merc 450SE             16.4       8    275.8    180     3.07  4.070    17.40
#> Merc 450SL             17.3       8    275.8    180     3.07  3.730    17.60
#> Merc 450SLC            15.2       8    275.8    180     3.07  3.780    18.00
#> Cadillac Fleetwood     10.4       8    472.0    205     2.93  5.250    17.98
#> Lincoln Continental    10.4       8    460.0    215     3.00  5.424    17.82
#> Chrysler Imperial      14.7       8    440.0    230     3.23  5.345    17.42
#> Fiat 128               32.4       4     78.7     66     4.08  2.200    19.47
#> Honda Civic            30.4       4     75.7     52     4.93  1.615    18.52
#> Toyota Corolla         33.9       4     71.1     65     4.22  1.835    19.90
#> Toyota Corona          21.5       4    120.1     97     3.70  2.465    20.01
#> Dodge Challenger       15.5       8    318.0    150     2.76  3.520    16.87
#> AMC Javelin            15.2       8    304.0    150     3.15  3.435    17.30
#> Camaro Z28             13.3       8    350.0    245     3.73  3.840    15.41
#> Pontiac Firebird       19.2       8    400.0    175     3.08  3.845    17.05
#> Fiat X1-9              27.3       4     79.0     66     4.08  1.935    18.90
#> Porsche 914-2          26.0       4    120.3     91     4.43  2.140    16.70
#> Lotus Europa           30.4       4     95.1    113     3.77  1.513    16.90
#> Ford Pantera L         15.8       8    351.0    264     4.22  3.170    14.50
#> Ferrari Dino           19.7       6    145.0    175     3.62  2.770    15.50
#> Maserati Bora          15.0       8    301.0    335     3.54  3.570    14.60
#> Volvo 142E             21.4       4    121.0    109     4.11  2.780    18.60
#>                     vs_new am_new gear_new carb_new
#> Mazda RX4                0      1        4        4
#> Mazda RX4 Wag            0      1        4        4
#> Datsun 710               1      1        4        1
#> Hornet 4 Drive           1      0        3        1
#> Hornet Sportabout        0      0        3        2
#> Valiant                  1      0        3        1
#> Duster 360               0      0        3        4
#> Merc 240D                1      0        4        2
#> Merc 230                 1      0        4        2
#> Merc 280                 1      0        4        4
#> Merc 280C                1      0        4        4
#> Merc 450SE               0      0        3        3
#> Merc 450SL               0      0        3        3
#> Merc 450SLC              0      0        3        3
#> Cadillac Fleetwood       0      0        3        4
#> Lincoln Continental      0      0        3        4
#> Chrysler Imperial        0      0        3        4
#> Fiat 128                 1      1        4        1
#> Honda Civic              1      1        4        2
#> Toyota Corolla           1      1        4        1
#> Toyota Corona            1      0        3        1
#> Dodge Challenger         0      0        3        2
#> AMC Javelin              0      0        3        2
#> Camaro Z28               0      0        3        4
#> Pontiac Firebird         0      0        3        2
#> Fiat X1-9                1      1        4        1
#> Porsche 914-2            0      1        5        2
#> Lotus Europa             1      1        5        2
#> Ford Pantera L           0      1        5        4
#> Ferrari Dino             0      1        5        6
#> Maserati Bora            0      1        5        8
#> Volvo 142E               1      1        4        2

Created on 2022-03-08 by the reprex package (v2.0.1)

  • Related