大家好,我是飞哥,很多时候,我们需要对Excel进行批量处理,毕竟,没有批量二字,就彰显不出程序员的气质。
比如,我们有300个Excel表格,数据格式类似,我们想对其进行读取,然后合并。
当然,合并包括,行堆积,列对接,根据ID列合并等操作。在R语言都是可以实现的。
还有一个Excel表格,有100个Sheet,想把这100个sheet表读取然后合并。
还有一种情况,是有100个Excel表格,想把其合并到一个Excel中不同的sheet。
虽然,我知道大家的电脑内存很大,但是你这样折腾Excel真的好吗???
多年的工作经验告诉我,永远不要质疑,不要质疑对你提出需求的人,比如我说:“你为什么要把100个Excel表格合并到一个Excel的不同sheet中?电脑能打开吗?你能一个sheet一个sheet的看数据吗?为什么不合并到一个sheet中,然后用数据透视表查看筛选?”然后我就要两件事都要做,还要介绍Excel表如何用筛选功能。
不管怎么说,有需求就有答案。有句歌词写得特别好:“擦干泪,不要问,为什么”。
教程来了
模拟数据的过程很简单,新建一个Excel,里面加点内容,然后复制粘贴,重命名。
❝懂了这么多编程知识,这一步显得不够高科技,但是确实是很直接。❞
「步骤:」
library(tidyverse)
library(openxlsx)
list_name = dir("./",pattern = ".xlsx")
list_name
re = map(list_name, ~ read.xlsx(.,sheet=1))
re
names(re) = list_name
re
write.xlsx(re,"../re_hebing.xlsx")
目录:
读取结果:
结果文件:
「步骤:」
name_sheet = 1:8
re2 = map(name_sheet, ~ read.xlsx("../re_hebing.xlsx",sheet=.))
re2
「步骤:」
这里,我们用re
的结果:
> str(re)
List of 8
$ a1.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a2.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a3.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a4.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a5.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a6.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a7.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
$ a8.xlsx:'data.frame': 4 obs. of 2 variables:
..$ ID: num [1:4] 1 2 3 4
..$ y : num [1:4] 0.6275 0.4325 0.6046 0.0681
这里,我们将工作目录设置为上一级,用map2
进行操作:
setwd("../")
sheet_name = names(re)
sheet_name
map2(re,sheet_name,write.xlsx)
结果:
这就不用操作,直接写入就行了,一行代码:
write.xlsx(re,"new_new_many_sheets.xlsx")
分割线
大家好,我是邓飞,一个持续分享的农业数据分析师