【问题标题】:Reading multiple excel files into R using the map function使用map函数将多个excel文件读入R
【发布时间】:2019-02-18 08:37:02
【问题描述】:

我知道有类似的问题,但我没有遇到过使用 purrr 包中的 map 函数的问题。我在尝试使用purrr::map() 读取一些 excel 文件(.xlsx)时遇到了困难。我希望每个都是它自己的数据框。我在这个类似的问题中尝试了这种方法:How can I reading multiple (excel) files into R?

但是,我不断收到此错误:

错误:路径不存在:“tab3_DOfinal_HUClevel_assessment.xlsx”

我确定我有正确的道路。不知道为什么我会收到这个错误。我有大约 9 个 Excel 电子表格要阅读。

我试过的代码:

# load necessary package
library(purrr)

file.list <- list.files(path="2016_Data_Tables",pattern='*.xlsx')
file.list <- setNames(file.list, file.list)

# store all .xlsx files as individual data frames inside of one list
df <- map(file.list, read_xlsx)

文件名模式如下:

tab3_DOfinal_HUClevel_assessment.xlsx

唯一改变的是 DOfinal 部分。

一些示例数据:

structure(list(ID = 1, WMA = 15, Number = "02040302020030-01", 
    HUC14 = "HUC02040302020030", Name = "Absecon Creek (AC Reserviors) (gage to SB)", 
    Region = "Atlantic Coast", NumofStations = "2", ListofStations = "01410455, R32", 
    ListofAssessment = "2, 2", HUCTier = "2", swqs = "PL, SE1", 
    TotalNumSamples5yrs = "NA", flgusgsprelim = "NA, 0", auassess = 2, 
    auassesstrout = -999, finalauassess = 2, finalauassesstrout = -999, 
    Changefrom2014 = "No Change-2", Changetroutfrom2014 = "No Change", 
    listHUC14assess5 = "NA", listHUC14assess3 = "NA", listHUC14assess2 = "01410455, R32", 
    His2014 = "Attaining", His2014trout = "-999", Notes = NA_character_, 
    OldStations2014 = "01410455", OldStationsAssess2014 = "2", 
    Error = NA_character_), .Names = c("ID", "WMA", "Number", 
"HUC14", "Name", "Region", "NumofStations", "ListofStations", 
"ListofAssessment", "HUCTier", "swqs", "TotalNumSamples5yrs", 
"flgusgsprelim", "auassess", "auassesstrout", "finalauassess", 
"finalauassesstrout", "Changefrom2014", "Changetroutfrom2014", 
"listHUC14assess5", "listHUC14assess3", "listHUC14assess2", "His2014", 
"His2014trout", "Notes", "OldStations2014", "OldStationsAssess2014", 
"Error"), row.names = c(NA, -1L), class = c("tbl_df", "tbl", 
"data.frame"))


structure(list(WMA = 15, Number = "02040302020030-01", HUC14 = "HUC02040302020030", 
    Name = "Absecon Creek (AC Reserviors) (gage to SB)", Region = "Atlantic Coast", 
    NumofStations = "1", ListofStations = "01410455", ListofAssessment = "2", 
    MaxStaAssessment = "2", MinStaAssessment = "2", TotalNumSamples5yrs = "NA", 
    auassess = "2", ChangeFrom2014 = "No Change-2", liststaassess2 = "01410455", 
    liststaassess3 = "NA", liststaassess5 = "NA", Assessment2014 = "Attaining", 
    Comments = NA_character_), .Names = c("WMA", "Number", "HUC14", 
"Name", "Region", "NumofStations", "ListofStations", "ListofAssessment", 
"MaxStaAssessment", "MinStaAssessment", "TotalNumSamples5yrs", 
"auassess", "ChangeFrom2014", "liststaassess2", "liststaassess3", 
"liststaassess5", "Assessment2014", "Comments"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

structure(list(WMA = 15, Number = "02040302020030-01", HUC14 = "HUC02040302020030", 
    Name = "Absecon Creek (AC Reserviors) (gage to SB)", Region = "Atlantic Coast", 
    NumofStations = "1", ListofStations = "R32", ListofAssessment = "3", 
    MaxStaAssessment = "3", MinStaAssessment = "3", TotalNumSamples5yrs = "9", 
    auassess = "3", ChangeFrom2014 = "No Change-3", liststaassess2 = "NA", 
    liststaassess3 = "R32", liststaassess5 = "NA", Assessment2014 = "N/A", 
    Comments = NA_character_), .Names = c("WMA", "Number", "HUC14", 
"Name", "Region", "NumofStations", "ListofStations", "ListofAssessment", 
"MaxStaAssessment", "MinStaAssessment", "TotalNumSamples5yrs", 
"auassess", "ChangeFrom2014", "liststaassess2", "liststaassess3", 
"liststaassess5", "Assessment2014", "Comments"), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 这里有一个策略:尝试使用包含每个文件路径的列创建一个数据框。然后使用mutate(newcol = map_df(filename, read_xls)unnest
  • 您需要list.files(path="2016_Data_Tables", pattern='*.xlsx', full.names = TRUE) (否则文件名与path 参数相关,而不是与当前文件夹相关)。或sapply("2016_Data_Tables", file.path, list.files(path="2016_Data_Tables", pattern='*.xlsx'))

标签: r excel dataframe purrr


【解决方案1】:

Aurèle 对您的文件路径提出了一个非常好的观点。

我希望每个都是自己的数据框

如果这是目标,那么 purrr::iwalkassign 的组合可以轻松实现。流程如下:

  1. 获取位于2016_Data_Tables/ 中的所有.xlsx 文件的列表。
  2. 然后使用purrr::set_names 命名此列表中的每个元素,其文件名不带.xlsx 扩展名。
  3. 然后使用purrr::iwalkassign 函数应用于列表中的每个元素。具体来说,使用read_xlsx 将每个.xlsx 文件从磁盘读取到数据帧中,然后将该数据帧作为命名对象分配给R 的全局环境
list.files('data/mpg', pattern = '.xlsx', full.names = T) %>% 
  purrr::set_names(stringr::str_remove(basename(.), '.xlsx$')) %>% 
  purrr::iwalk(function(x, i) assign(i, readxl::read_xlsx(x), .GlobalEnv))

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多