Применение одинаковых имен столбцов к нескольким столбцам - PullRequest
3 голосов
/ 03 июля 2019

Я хотел бы использовать функцию 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 ко всем фреймам данных в одной строке кода, возможно, используя некоторые виды purrr s map или одна из apply функций в базе R, но я совершенно не знаю, как.

Ответы [ 2 ]

4 голосов
/ 03 июля 2019

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, а не изменять объекты в глобальном окружении

.
0 голосов
/ 03 июля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...