Предположим, у меня есть два файла Excel в моем подкаталоге:
.../Myfolder/File1.xlsx
.../Myfolder/File2.xlsx
Я знаю, что могу прочитать их в R в виде списка, используя следующую формулу:
data <- list.files(path = "./Myfolder/", pattern = "*.xlsx", full.names = T)
data.list <- lapply(data, read_excel)
Однако я хочу назвать свои объекты в списке в соответствии с именем файла. То есть имя первого объекта должно быть «Файл1», а второго — «Файл2». Я могу использовать:
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
вы можете передать назначение имени, что предпочтительнее, чем иметь два выражения: одно для создания данных, другое для их маркировки.
PS:
Вот как бы я поступил в наши дни:
library(tidyverse)
library(readxl)
library(fs)
fs::dir_ls(
path = "folder/",
glob = "*.xlsx") %>%
purrr::set_names(
x = purrr::map(., readxl::read_excel),
nm = .)
# or maybe within a tibble?
tibble::tibble(
path = fs::dir_ls(
path = "folder/",
glob = "*.xlsx"),
data = purrr::map(path, readxl::read_excel))
Мне пришлось изменить с. Тем не менее, он сохраняет окончательное расширение имени пути в именах списков, что мне не нравится.
(list.files(path = 'filepath ', pattern = "\\.xlsx$", full.names = TRUE) %>%
keep(~ str_detect(.x, '\\.xlsx$')) %>%
set_names(.) %>%
map(read_excel) ->
data)