0

I have this data frame and I would like to rename the column name inside the loop, but it doesn't do what I want.


    list_prices_python[[1]]

       DATE       Instrument TR.CLOSEPRICE
       <date>     <chr>              <dbl>
     1 2009-01-01 NA                  356.
     2 2009-01-02 NA                  356.
     3 2009-01-03 NA                  356.
     4 2009-01-04 NA                  357.
     5 2009-01-05 NA                  357.
     6 2009-01-06 NA                  357.
     7 2009-01-07 NA                  357.
     8 2009-01-08 NA                  357.
     9 2009-01-09 NA                  357.
    10 2009-01-10 NA                  357.


    name_prices_python


     [1] "ASF.CN"   "CAR_p.CN" "CIC.CN"   "CLM.CN"   "CON.CN"   "CTV.CN"   "DVI_p.CN" "FGN.CN"   
 "GNO.CN"   "MYG.CN"  
    [11] "ORB.CN"   "PMG.CN"   "RPI.CN"   "TPL.CN"   "TRR.CN"  


for(i in name_prices_python){
  
  list_prices_python[[i]] %>% 
    dplyr::rename(i = `TR.CLOSEPRICE`) -> list_prices_python[[i]]
  
}

The output is each column named "i". Not what I expected.

    # A tibble: 4,944 x 3
       DATE       Instrument     i
       <date>     <chr>      <dbl>
     1 2009-01-01 NA          356.
     2 2009-01-02 NA          356.
     3 2009-01-03 NA          356.
     4 2009-01-04 NA          357.
     5 2009-01-05 NA          357.
     6 2009-01-06 NA          357.
     7 2009-01-07 NA          357.
     8 2009-01-08 NA          357.
     9 2009-01-09 NA          357.
    10 2009-01-10 NA          357.


What should I modify? Thank you.

Created on 2022-07-15 by the reprex package (v2.0.1)

Mick
  • 67
  • 7
  • I can't tell what you do expect. It looks like you want to rename a single column, so why use a loop at all? – Gregor Thomas Jul 16 '22 at 04:03
  • because I have many different data frames within a list – Mick Jul 16 '22 at 04:06
  • Ah, okay. And in each data frame in the list you want to rename the `TR.CLOSEPRICE` column to the respective element of `name_prices_python`? So the first one gets named `"ASF.CN"`, the second `"CAR_p.CN"`, etc? – Gregor Thomas Jul 16 '22 at 04:07
  • Yes, exactly. I want to rename the variable TR.CLOSEPRICE. – Mick Jul 16 '22 at 04:12

1 Answers1

1

To use a variable on the LHS of an assignment in dplyr you need to both use := for the assignment and use {{}} to turn the variable into a symbol.

Here's a reproducible example:

sample_list = list(head(mtcars, 2), head(mtcars, 2))
name_vec = c("MPG1", "MPG2")
names(sample_list) = name_vec
for(i in name_vec) {
  sample_list[[i]] = sample_list[[i]] %>% rename({{i}} := mpg)
}
sample_list
# $MPG1
#               MPG1 cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4       21   6  160 110  3.9 2.620 16.46  0  1    4    4
# Mazda RX4 Wag   21   6  160 110  3.9 2.875 17.02  0  1    4    4
# 
# $MPG2
#               MPG2 cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4       21   6  160 110  3.9 2.620 16.46  0  1    4    4
# Mazda RX4 Wag   21   6  160 110  3.9 2.875 17.02  0  1    4    4

Note that this assumes that the names of your list_prices_python are name_prices_python (which seems to be implied by the name and your apparently successful use of list_prices_python[[i]] inside the loop).

You can read more about this in the FAQ Use dynamic name for new column/variable in dplyr.

Gregor Thomas
  • 136,190
  • 20
  • 167
  • 294