【问题标题】:Import multiple Excel files with names in R as a list将多个具有 R 中名称的 Excel 文件作为列表导入
【发布时间】:2020-12-12 11:00:35
【问题描述】:

假设我的子目录中有两个 Excel 文件:

.../Myfolder/File1.xlsx
.../Myfolder/File2.xlsx

我知道我可以使用以下公式将它们作为列表读入 R:

data      <- list.files(path = "./Myfolder/", pattern="*.xlsx", full.names = T)
data.list <- lapply(data, read_excel)

但是,我想根据文件名在列表中命名我的对象。也就是说,第一个对象名称应为“File1”,第二个对象名称应为“File2”。我可以使用:

names(data.list) <- data

但后来我得到了全名(因为我使用 full.names = T)。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以这样做:

    names(data.list) <- sub('\\.xlsx', '', basename(data))
    

    或者没有任何正则表达式:

    names(data.list) <- tools::file_path_sans_ext(basename(data))
    

    【讨论】:

      【解决方案2】:

      这就是你要问的。

      library(tidyverse)
      library(stringr)
      library(readxl)
      
      (list.files('folder_with_sheets') %>%
          keep(~ str_detect(.x, '.xlsx')) %>%
          set_names(.) %>%
          map(read_excel) ->
          data)
      
      

      但是假设它们在每个中都有相同的列:

      library(tidyverse)
      library(stringr)
      library(readxl)
      
      (list.files('folder_with_sheets') %>%
          keep(~ str_detect(.x, '.xlsx')) %>%
          map_dfr(~ read_excel(.x) %>% mutate(sheet = .x)) ->
          data)
      
      

      假设他们都共享一个标识列并代表关于同一个人的不同数据:

      library(tidyverse)
      library(stringr)
      library(readxl)
      
      (list.files('folder_with_sheets') %>%
          keep(~ str_detect(.x, '.xlsx')) %>%
          map(read_excel) %>%
          reduce(left_join) -> # or reduce(~ left_join(.x, .y, by = 'key_variable_name')
          data)
      
      

      无论哪种方式,您都可以使用set_names 进行名称分配,这比使用两个表达式更可取,一个用于创建数据,另一个用于标记数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 2020-09-28
        • 1970-01-01
        相关资源
        最近更新 更多