在与 purrr 和 readxl 合并之前标准化 excel 工作表中的列名称
Standardize column names in excel sheets before combining with purrr and readxl
我想编译一个 Excel 文件,其中包含按年份(2016、2015、2014 等)标记的多个选项卡。每个选项卡都有相同的数据,但列名的拼写可能每年都不同。
我想在合并之前标准化每个 sheet 中的列。
这是将 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()) )
..但是语法全错了。
创建一个新函数是可行的,但是很冗长并且使用了两个映射:
# 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")
与其定义您自己的函数,janitor 包中的 clean_names
函数也许能够帮助您。它需要 dataframe/tibble 作为输入,returns 带有干净名称的 dataframe/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")
我想编译一个 Excel 文件,其中包含按年份(2016、2015、2014 等)标记的多个选项卡。每个选项卡都有相同的数据,但列名的拼写可能每年都不同。
我想在合并之前标准化每个 sheet 中的列。
这是将 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()) )
..但是语法全错了。
创建一个新函数是可行的,但是很冗长并且使用了两个映射:
# 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")
与其定义您自己的函数,janitor 包中的 clean_names
函数也许能够帮助您。它需要 dataframe/tibble 作为输入,returns 带有干净名称的 dataframe/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")