【问题标题】:Import sheets from Excel files located in different folder in R从位于 R 中不同文件夹中的 Excel 文件导入工作表
【发布时间】:2019-06-30 04:01:01
【问题描述】:

基本上我在两个不同的文件夹中有两个同名“清单”的 Excel 文件(一个是 2018 年,另一个是 2019 年)。清单有不同的表格,每个月一张:“一月”、“二月”等……当然,所有的表格都有完全相同的变量。 我想将两个 Excel 文件中的所有工作表放入同一个数据框中。 现在,我可以从一个 Excel 文件中收集表格:

library(readxl)   
library(tibble)
read_excel_allsheets <- function(filename, tibble = TRUE) {
  sheets <- readxl::excel_sheets(filename)
  x <- lapply(sheets, function(X) readxl::read_excel(filename, sheet = X))
  if(!tibble) x <- lapply(x, as.data.frame)
  names(x) <- sheets
  x
}

mysheets <-read_excel_allsheets("C:/Users/Thiphaine/Documents/2018/Checklist.xlsx")
library(dplyr)
mysheets<-bind_rows(mysheets, .id = "column_label")

我只是不知道如何创建一个循环,该循环将遍历文件夹 2018 和 2019 以收集两个 Excel 文件中的所有工作表。这个想法也将是,在 2020 年,我将有另一个文件夹“2020”应该包括在内......有什么想法吗?谢谢

【问题讨论】:

    标签: r excel loops import readxl


    【解决方案1】:

    试试这个:

    library(dplyr)
    allsheets <- list()
    for(file in list.files(path = "PATH/TO/DCUMENTS/", 
        recursive = TRUE, pattern = "*.xlsx", full.names = TRUE)) {
      mysheets <- read_excel_allsheets(file)
      mysheets <- bind_rows(mysheets, .id = "column_label") 
      allsheets[[file]] <- mysheets
    }
    

    PATH/TO/DOCUMENTS 对你来说可能类似于 "C:/Users/Thiphaine/Documents/

    【讨论】:

    • 感谢 Alko,我收到一条消息错误“错误:path 不存在:‘Checklist.xlsx’”
    • 你使用了修改后的代码吗?我写的第一个假设您正在阅读工作目录下的文件。如果您使用full.names = TRUE,它会列出所有文件的完整路径。
    • 实际上它现在可以工作,但我只从其中一个文件夹中获取数据
    • 检查 `list.files(path = "PATH/TO/DCUMENTS/", recursive = TRUE, pattern = "*.xlsx", full.names = TRUE)` 是否为您提供您要提取的所有文件。如果是,那么您添加的代码用于编写有问题的文件。可能它会覆盖结果。
    • 我用一种方法编辑了答案,列出了所有工作表。
    【解决方案2】:

    如果您愿意,也可以使用tidyverse 方法对其进行矢量化。特别是因为您的所有文件都是相同的(列名)并且您希望以 data.frame 结尾。

    require(tidyverse)
    
    df <- list.files(path = "your_path",
                           full.names = TRUE,
                           recursive = TRUE,
                           pattern = "*.xls") %>% 
    tbl_df() %>%
    mutate(sheetName = map(value, readxl::excel_sheets)) %>%
    unnest(sheetName) %>% 
    mutate(myFiles = purrr::map2(value, sheetName, function(x,y) {
        readxl::read_excel(x, sheet = paste(y))})) %>% 
    unnest(myFiles)
    

    【讨论】:

    • 除了将某些日期转换为数字之外,它有点工作。但基本上使用这种方法,我不需要我的代码来导入每张纸?!哪条线做的?我不确定这里的代码是否理解
    • 它有效,但我有一些非常奇怪的行:“ / Date”所以我试图跳过我的文件中前 5 行无用,代码第 7 行带有“read_excel(x, sheet = paste(y), skip=4)”,但我有一个警告“bind_rows_(x, .id) 中的错误:列&lt;U+0414&gt;&lt;U+0430&gt;&lt;U+0442&gt;&lt;U+0430&gt; / Date 无法从字符转换为 POSIXct/POSIXt"
    • 看来您的 Excel 日期/时间格式可能不一致或错误。您的工作表中有多少列?如果不是很多,您可以在阅读之前使用col_types 参数定义它们(而不是让read_excel 函数猜测)。这些是您的选项:“跳过”、“猜测”、“逻辑”、“数字”、“日期”、“文本”或“列表”。因此,您的日期/时间格式定义为“文本”而不​​是“日期”
    • 你可以在这里查看更多关于read_excel参数readxl.tidyverse.org/reference/read_excel.html的信息
    • 所以,我输入 col_types 参数,最终得到 50 个警告:1:在 read_fun(path = enc2native(normalizePath(path)), sheet_i = sheet, ... :期待A6 / R6C1 中的日期:得到 '01.11.2018' 和一些 NA 而不是一些日期。但是,如果有时对于同一张纸,我有一些日期和 NA...
    猜你喜欢
    • 1970-01-01
    • 2019-04-22
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多