簡體   English   中英

以列表的形式導入多個Excel名稱在R中的文件

[英]Import multiple Excel files with names in R as a list

假設我的子目錄中有兩個 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)。

你可以做:

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

或者沒有任何正則表達式:

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

這就是你要問的。

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您都可以在名稱分配中使用 pipe,這比使用兩個表達式更可取,一個用於創建數據,另一個用於 label。

我不得不修改。 但是,它確實在列表名稱中保留了最終路徑擴展名,這是我不喜歡的。

(list.files(path = 'filepath ', pattern = "\\.xlsx$", full.names = TRUE) %>%
    keep(~ str_detect(.x, '\\.xlsx$')) %>%
    set_names(.) %>%
    map(read_excel) ->
    data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM