переименуйте первые имена столбцов в списке кадров данных, чтобы они соответствовали имени кадра данных

#r #list #dataframe #rename #lapply

Вопрос:

У меня есть список кадров данных. каждый фрейм данных содержит 1 столбец с именем «a». Я хочу переименовать столбец «a» каждого фрейма данных, вставив имя фрейма данных после имени столбца «a». Вот пример.

 green <- data.frame(a=c(1,2,3,4,5))
 
 > green
  a
1 1             
2 2             
3 3             
4 4         
5 5
 
 yellow <- data.frame(a=c(6,7,8,9,10))
 
 black <- data.frame(a=c(11,12,13,14,15))
 
 my_list <- list(green=green,
                yellow=yellow,
                black=black)
 
 names(my_list)
[1] "green"  "yellow" "black" 
 

Мои желаемые результаты должны быть примерно такими:

 > green
  a_green
1 1             
2 2             
3 3             
4 4         
5 5
 
 > yellow
   a_yellow
1  6
2  7
3  8
4  9
5 10
 

и так далее…

Я пытался сделать это с лапли, но есть ли что-то не так, чего я не понимаю…

 my_list <- lapply(my_list, function(x)
  colnames(x)=paste(colnames(x), names(x), sep = "_"))
 

Ответ №1:

Вот несколько вариантов —

  1. С помощью tidyverse
 library(dplyr)
library(purrr)

imap(my_list, ~.x %>% rename_with(function(x) paste(x, .y, sep = '_'), 1))

#$green
#  a_green
#1       1
#2       2
#3       3
#4       4
#5       5

#$yellow
#  a_yellow
#1        6
#2        7
#3        8
#4        9
#5       10

#$black
#  a_black
#1      11
#2      12
#3      13
#4      14
#5      15
 

Или в базе R —

 Map(function(x, y) {
    names(x)[1] <- paste(names(x)[1], y, sep = '_')
    x
}, my_list, names(my_list))
 

Вы можете упростить процесс, если у вас есть только 1 столбец в каждом кадре данных, как в примере.

 Map(setNames, my_list, paste('a', names(my_list), sep = '_'))
 

Ответ №2:

Вы можете использовать purrr::imap

 library(tidyverse)
black <- tibble(a = 1:10)
yellow <- tibble(a = 11:21)

list("black" = black, "yellow" = yellow) %>%
  imap((x, y){
    x %>%
      set_names(glue::glue("a_{y}"))
  })
#> $black
#> # A tibble: 10 x 1
#>    a_black
#>      <int>
#>  1       1
#>  2       2
#>  3       3
#>  4       4
#>  5       5
#>  6       6
#>  7       7
#>  8       8
#>  9       9
#> 10      10
#> 
#> $yellow
#> # A tibble: 11 x 1
#>    a_yellow
#>       <int>
#>  1       11
#>  2       12
#>  3       13
#>  4       14
#>  5       15
#>  6       16
#>  7       17
#>  8       18
#>  9       19
#> 10       20
#> 11       21