Вы можете извлечь имена файлов из символьных элементов file_list
, используя регулярное выражение, и добавить их в качестве дополнительного столбца в каждый импортированный фрейм данных или для установки новых имен столбцов.
Обратите внимание, что я использую .xlsx
вместо .xls
. Когда я использую последний, я получаю сообщение об ошибке по какой-то причине (вероятно, проблема с записью в .xls
). Убедитесь, что вы изменили суффиксы для работы с вашими файлами.
Во-первых, библиотеки и данные:
library(tidyverse)
library(readxl)
library(writexl)
dir.create("folder")
walk(1:4, ~ write_xlsx(tibble(x = sample(10, 5), y = sample(10, 5)),
str_glue("folder/file{.}.xlsx")
)
)
Чтобы получить требуемый формат фрейма данных, вы можете сделать что-нибудькак это:
map_dfc(file_list, ~ {
df <- read_excel(.)
set_names(df, paste(str_match(., "/(.*?)\\.")[,2], names(df), sep = "_"))
})
Это вернет "широкий" фрейм данных, который выглядит примерно так:
# A tibble: 3 x 8
file1_x file1_y file2_x file2_y file3_x file3_y file4_x file4_y
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 8 9 5 3 3 6 3 9
2 3 5 8 6 7 5 2 5
3 4 10 7 2 8 2 7 1
Но этот тип фрейма данных не очень полезен, если вы хотитесуммировать с dplyr
или визуализировать данные с ggplot2
. Я бы порекомендовал вам попробовать "длинный" формат. Поместите read_excel
в вызов mutate
, который добавляет переменную с извлеченными именами файлов:
file_list <- list.files("folder", full.names=TRUE, pattern = ".xlsx")
map_df(file_list, ~ mutate(read_excel(.), file = str_match(., "/(.*?)\\.")[,2]))
Вы должны получить фрейм данных, который выглядит примерно так, где наблюдения группируются по файлам. имя:
# A tibble: 12 x 3
x y file
<dbl> <dbl> <chr>
1 8 9 file1
2 3 5 file1
3 4 10 file1
4 5 3 file2
5 8 6 file2
6 7 2 file2
7 3 6 file3
8 7 5 file3
9 8 2 file3
10 3 9 file4
11 2 5 file4
12 7 1 file4