#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:
Вот несколько вариантов —
- С помощью
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