重命名数据框列表中的第一个 colnames 以匹配数据框的名称

rename first colnames in list of dataframes to match the name of the dataframe

我有一个数据帧列表。每个数据框都有 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

等等...

我正在尝试使用 lapply 执行此操作,但有什么地方不对吗...

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

这里有几个选项 -

  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 = '_'))

您可以使用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