Я пытаюсь использовать map для обработки списка data.frame. Мои цели: если имена Data [[]]% в% datamap$col.name, переименуйте его как datamap$VAR. Мои коды и сообщение об ошибке:

enter image description here

Что я сделал не так? Как мне это исправить?

r
1
Stataq 9 Фев 2021 в 23:27

1 ответ

Лучший ответ

Вместо цикла for используйте rename с именованным вектором

library(dplyr)
library(purrr)
Data1 <-  map(Data, ~ 
          {datamap_sub <- datamap %>% 
                            filter(col_name %in% names(.x))
        .x %>%
            rename(!!! setNames(datamap_sub$col_name, datamap_sub$VAR))
            })

-вывод

#[[1]]
#   SL Sepal.Width Petal.Length Petal.Width     Sp
#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

#[[2]]
#                  mpg_new cyl disp  hp drat wt_new  qsec vs am gear carb
#Mazda RX4            21.0   6  160 110 3.90  2.620 16.46  0  1    4    4
#Mazda RX4 Wag        21.0   6  160 110 3.90  2.875 17.02  0  1    4    4
#Datsun 710           22.8   4  108  93 3.85  2.320 18.61  1  1    4    1
#Hornet 4 Drive       21.4   6  258 110 3.08  3.215 19.44  1  0    3    1
#Hornet Sportabout    18.7   8  360 175 3.15  3.440 17.02  0  0    3    2
#Valiant              18.1   6  225 105 2.76  3.460 20.22  1  0    3    1

Или используйте rename_at

map(Data, ~ {
    datamap_sub <- datamap %>% 
                         filter(col_name %in% names(.x))
   .x %>%
     rename_at(vars(datamap_sub$col_name), ~ datamap_sub$VAR)
   })

Данные

datamap <- data.frame(col_name = c('Sepal.Length', 'Species', 'mpg',
      'wt'), VAR = c('SL', 'Sp', 'mpg_new', 'wt_new'))
Data <- list(head(iris), head(mtcars))
1
akrun 9 Фев 2021 в 20:52