Стандартизуйте имена столбцов в листах Excel перед объединением с purrr и readxl - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы скомпилировать файл Excel с несколькими вкладками, помеченными по годам (2016, 2015, 2014 и т. Д.). Каждая вкладка содержит идентичные данные, но названия столбцов могут быть написаны по-разному от года к году.

Я бы хотел стандартизировать столбцы на каждом листе перед объединением.

Это общий способ объединения, использующий purrr и readxl для таких задач:

combined.df <- excel_sheets(my.file) %>% 
  set_names() %>%                                 
  map_dfr(read_excel, path = my.file, .id = "sheet") 

... однако, как уже отмечалось, это создает отдельные столбцы для "COLUMN ONE" и "Column One", которые имеют одинаковые данные.

Вставка make.names в конвейер, вероятно, будет лучшим решением.

Идеально было бы хранить все вместе ... что-то вроде:

   combined.df <- excel_sheets(my.file) %>% 
    set_names() %>% 
    map(read_excel, path = my.file) %>% 
    map(~(names(.) %>%  #<---WRONG
            make.names() %>% 
            str_to_upper() %>% 
            str_trim() %>% 
            set_names()) ) 

.. но синтаксис неверен.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Вместо того, чтобы определять собственную функцию, функция clean_names из пакета janitor может помочь вам. Он принимает фрейм данных / tibble в качестве входных данных и возвращает фрейм данных / tibble с чистыми именами в качестве выходных данных.

Вот пример:

library(tidyverse)

tibble(" a col name" = 1,
       "another-col-NAME" = 2,
       "yet another name  " = 3) %>% 
    janitor::clean_names()
#> # A tibble: 1 x 3
#>   a_col_name another_col_name yet_another_name
#>        <dbl>            <dbl>            <dbl>
#> 1          1                2                3

Затем вы можете добавить его прямо в код, который вы дали:

combined.df <- excel_sheets(my.file) %>% 
    set_names() %>%
    map(read_excel, path = my.file) %>%  #<Import as list, not dfr
    map(janitor::clean_names) %>%        #<janitor::clean_names
    bind_rows(.id = "sheet")
0 голосов
/ 05 сентября 2018

Создание новой функции выполнимо, но многословно и использует две карты:

  # User defined function: col_rename
  col_rename <- function(df){
    names(df) <- names(df) %>% 
     str_to_upper() %>% 
     make.names() %>% 
     str_trim()
   return(df)
  }

   combined.df <- excel_sheets(my.file) %>% 
    set_names() %>%
    map(read_excel, path = my.file) %>%  #<Import as list, not dfr
    map(col_rename) %>%                  #<Fix colnames (user defined function)
    bind_rows(.id = "sheet")
...