重命名数据框列表中的第一个 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 = "_"))
这里有几个选项 -
- 使用
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
我有一个数据帧列表。每个数据框都有 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 = "_"))
这里有几个选项 -
- 使用
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