r - R合并所有Excel文件中的所有工作表
问题描述
我正在尝试合并文件夹中所有 Excel 文件中所有工作表的数据。所有工作表和所有文件都具有相同的标题和相同的数据集。我认为下面的代码会读取所有工作表,但它似乎只读取每个文件中的第一张工作表。
# This needs several other packages
# install.packages("XLConnect")
require(XLConnect)
setwd("C:/Users/Excel/Desktop/Coding/R Programming/Excel/Excel_Files/")
fpattern <- "File.*.xls*?" # pattern for filenames
output.file <- "Test.xls"
lfiles <- list.files(pattern = fpattern)
# Read data from all sheets
lfiles %>%
excel_sheets() %>%
set_names() %>%
map(read_excel, lfiles = lfiles)
解决方案
我认为以下内容可以满足您的需求。在此示例中,并非每个文件都具有相同的工作表或列;test2.xlsx 只有一张纸,而 test3.xlsx sheet1 没有 col3。它还标记每个文件的文件和工作表名称。
library(tidyverse)
library(readxl)
dir_path <- "~/test_dir/" # target directory where the xlsx files are located.
re_file <- "^test[0-9]\\.xlsx" # regex pattern to match the file name format, in this case 'test1.xlsx', 'test2.xlsx' etc.
read_sheets <- function(dir_path, file){
xlsx_file <- paste0(dir_path, file)
xlsx_file %>%
excel_sheets() %>%
set_names() %>%
map_df(read_excel, path = xlsx_file, .id = 'sheet_name') %>%
mutate(file_name = file) %>%
select(file_name, sheet_name, everything())
}
df <- list.files(dir_path, re_file) %>%
map_df(~ read_sheets(dir_path, .))
# A tibble: 15 x 5
file_name sheet_name col1 col2 col3
<chr> <chr> <dbl> <dbl> <dbl>
1 test1.xlsx Sheet1 1 2 4
2 test1.xlsx Sheet1 3 2 3
3 test1.xlsx Sheet1 2 4 4
4 test1.xlsx Sheet2 3 3 1
5 test1.xlsx Sheet2 2 2 2
6 test1.xlsx Sheet2 4 3 4
7 test2.xlsx Sheet1 1 3 5
8 test2.xlsx Sheet1 4 4 3
9 test2.xlsx Sheet1 1 2 2
10 test3.xlsx Sheet1 3 9 NA
11 test3.xlsx Sheet1 4 7 NA
12 test3.xlsx Sheet1 5 3 NA
13 test3.xlsx Sheet2 1 3 4
14 test3.xlsx Sheet2 2 5 9
15 test3.xlsx Sheet2 4 3 1
推荐阅读
- selenium - 具有多个条件并获取元素值的 Selenium xpath
- ios - 如何以在 IB 中的方式将事件添加到 UIImageView 子类
- c# - 从 C# Windows 窗体调用 PHP Web 服务
- javascript - 如果未选中输入,则带有 Bootstrap Toggle 的复选框返回 null
- c# - 如何从文本框中获取日期时间并将其放入 SQL 语句
- docker - 无法运行 docker 镜像“quorra not found”
- javascript - angularjs过滤器只返回完全匹配的值
- spring-mvc - 映射器装饰器未编译
- angular - 当我尝试登录 Angular 6 时,不会调用路由身份验证保护
- apache-spark - Job 完成后,如何让每个 Spark Worker 只运行一次相同的功能?