Применение одних и тех же имен столбцов к нескольким таблицам

Я хотел бы использовать функцию names для применения одних и тех же имен столбцов к нескольким фреймам данных, все из которых имеют одинаковое количество столбцов. Я, конечно, могу сделать это неправильно, вызывая names для каждого кадра данных, но я хотел бы сделать это правильно. Вот настройка:

library(tidyverse)

df1 <- tibble(1,2,3,4,5)
df2 <- tibble(6,7,8,9,10)
df3 <- tibble(11,12,13,14,15)
df4 <- tibble(16,17,18,19,20)

column_names <- c("Alpha","Bravo","Charlie","Delta","Echo")
tibbles_list <- (c("df1","df2","df3","df4"))

Неправильный путь, конечно:

names(df1) <- column_names
names(df2) <- column_names
names(df3) <- column_names
names(df4) <- column_names

Я хотел бы каким-то образом использовать список кадров данных в tibbles_list (через as.name или rlang::syms или аналогичный), чтобы применить column_names ко всем кадрам данных в одной строке кода, возможно, используя некоторые виды map purrr или одну из функций apply в базе R , но я совершенно не понимаю, как это сделать.


person jbfink    schedule 03.07.2019    source источник
comment
Почему вы составляете список имен фреймов данных, а не только самих фреймов данных? Например tibbles_list <- list(df1, df2, df3, df4)   -  person camille    schedule 03.07.2019
comment
Привет, Камилла, без понятия. Я, наверное, многое делаю не так.   -  person jbfink    schedule 03.07.2019


Ответы (2)


tibbles_list — это просто vector идентификаторов объектов в виде строк. С помощью mget мы получаем значения объектов в list, прокручиваем список с помощью map и используем rename_all для изменения имен.

lst1 <- map(mget(tibbles_list), ~ .x %>%
                   rename_all(~ column_names))
list2env(lst1, .GlobalEnv)

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

map(mget(tibbles_list), ~ .x %>% 
            set_names(column_names))

ПРИМЕЧАНИЕ. Лучше хранить его в list и не изменять объекты в глобальной среде.

person akrun    schedule 03.07.2019
comment
первый пример не работает -- жалуется на то, что объект "Альфа" режима "функция" не найден -- но второй пример работает! Спасибо! - person jbfink; 03.07.2019
comment
@jbfink Извините, должно быть ~ Попробуйте сейчас - person akrun; 03.07.2019
comment
На самом деле у @akrun есть оставшаяся проблема - таблички на самом деле не сохраняются, когда я выполняю функцию карты - выполнение любой из этих карт, а затем прямой вызов таблички (например, просто набрав df1 в консоли) показывает старый столбец имена. Как я могу это исправить? - person jbfink; 03.07.2019
comment
@jbfink Я был на встрече. Забыл, что tibbles_list был вектором символов. Попробуйте с list2env обновить встречу - person akrun; 03.07.2019

Во-первых, будет намного лучше, если вы будете работать со списком фреймов данных, а не со списком имен фреймов данных, которые вам нужно затем извлечь из вашей среды. Если у вас есть выбор по этому вопросу, прекрасно; если нет, вы можете скопировать эти фреймы данных в один список.

Сообщение Как составить список фреймов данных? имеет 7 ответов с различными способами сделать это и причинами, включая методы, если у вас нет роскоши начать со списка.

Как только об этом позаботятся, вы можете установить имена с базой setNames (или rlang оболочкой set_names, чьи возможности здесь на самом деле не нужны), которая сама является оболочкой вокруг names. Используйте функцию сопоставления purrr или lapply для базовой версии.

library(dplyr)

dfs <- list(df1, df2, df3, df4)
dfs %>%
  purrr::map(~setNames(., column_names))
#> [[1]]
#> # A tibble: 1 x 5
#>   Alpha Bravo Charlie Delta  Echo
#>   <dbl> <dbl>   <dbl> <dbl> <dbl>
#> 1     1     2       3     4     5
##### cutting remaining output

lapply(dfs, function(x) setNames(x, column_names))
# same output as above

Так как setNames является оболочкой вокруг names:

lapply(dfs, function(x) {
  names(x) <- column_names
  x
})
# same output again
person camille    schedule 03.07.2019