[英]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.