繁体   English   中英

R:将几个Excel文件读入不同的数据框并同时进行浏览

[英]R: Reading several Excel files into different dataframes and exploring these at the same time

我正在编写一些R代码,将400个Excel文件转换为机器可读的平面文件。 接收这些Excel文件时,周转时间很短,并且不可能以计算机可读格式接收初始文件。

我有R代码,它将提取我们需要的行和列中的数据,删除空格并以MR格式很好地呈现它。 我现在需要解决的问题是,我需要确认400个文件中的每个文件的格式正确,以使该功能正常工作。 为此,我只想检查许多简单的事情,例如,每个Excel文件中的单元格A9中的“标题”列。

我是R的新手,我真的很努力地编写一个函数,让我可以一次性检查所有400个文件。

我最接近的是:

template_dir <- "file path of main directory"
files <- list.files(path=template_dir, pattern="*.xlsx", full.names=TRUE, recursive=TRUE) 
df.files <- lapply (files, read_excel)

然后,将生成包含400个元素的列表。 我可以分别加载每个这些都没有问题

df.files [1]

但是,如果我尝试使用:

title_loc <- which (df.files [1] == "Title", arr.ind = TRUE)

它不起作用,我只是得到一个空值。 我知道“哪个”功能有效,因为当我将单个Excel文件作为df读取到R中(或将文件路径放入)时,“哪个”功能正常工作并返回[1,9]预期。

这400个文件分布在几个文件夹中(我也无能为力),并且我可以使用list.files获得所有文件的列表。 我要做的是执行一系列简单的检查(对“ title”的引用;对“ age”的引用;对“ location”的引用等等),以确认所有400个文件都以相同的方式进行布局。 因此,在一个df中列出“ title”的输出是理想的,因此我可以检查所有400的列是否为“ 1”,所有400的行是否为“ 9”。

我想我想要的是:

title_loc <- which (*loop to cycle through every element in df.files* == "Title", arr.ind = TRUE)

但是编写循环的方法使我败下阵来。 获取列表中所有400个Excel文件的文件路径然后循环浏览(而不是使用lapply导入所有数据)会更容易吗?

谢谢

我不确定机器可读的格式是什么,但是如果您要遍历文件夹中的所有Excel文件并将其全部加载到Excel中,则以下代码示例将为您做到这一点。

# load names of excel files 
files = list.files(path = "C:\\your_path_here\\", full.names = TRUE, pattern = ".xlsx")

# create function to read multiple sheets per excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
  sheets <- readxl::excel_sheets(filename)
  sapply(sheets, function(f) as.data.frame(readxl::read_excel(filename, sheet = f)), 
         simplify = FALSE)
}

# execute function for all excel files in "files"
all_data <- lapply(files, read_excel_allsheets)

要么

library(XLConnect)

testDir <- "C:\\your_path_here\\"

re_file <- ".+\\.xls.?"
testFiles <- list.files(testDir, re_file, full.names = TRUE)

# This function rbinds in a single dataframe
# the content of multiple sheets in the same workbook
# (assuming that all the sheets have the same column types)
rbindAllSheets <- function(file) {
  wb <- loadWorkbook(file)
  sheets <- getSheets(wb)
  do.call(rbind,
          lapply(sheets, function(sheet) {
            readWorksheet(wb, sheet)
          })
  )
}

# Getting a single dataframe for all the Excel files
result <- do.call(rbind, lapply(testFiles, rbindAllSheets))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM