在与purrr和readxl结合之前,在Excel工作表中标准化列名

时间:2018-09-05 14:40:58

标签: r purrr readxl

我想编译一个带有以年份(2016、2015、2014等)标记的多个选项卡的Excel文件。每个选项卡具有相同的数据,但是列名的拼写可能与年份不同。

我想在合并之前标准化每张工作表中的列。

这是将purrrreadxl用于此类任务的通用方式:

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 :(得分:1)

janitor软件包中的clean_names函数可能没有帮助,而是定义了自己的函数。它以一个数据框/小标题作为输入,并以干净名称返回一个数据框/小标题作为输出。

这是一个例子:

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")

答案 1 :(得分:0)

创建一个新函数是可行的,但是很冗长,并且使用了两个映射:

  # 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")