Есть ли способ установить имя файла в качестве имени столбца автоматически? - PullRequest
1 голос
/ 03 ноября 2019

Я относительно новичок в R. У меня есть папка с большим количеством файлов (например, 5m.xls, 10m.xls, ...). Я использую map_dfc для чтения файлов (см. Код ниже) и помещаю их в одну таблицу. файлы содержат таблицу из 2 столбцов (x, y). таблица, которую я получаю после запуска моего кода, содержит столбцы с именами x1, y1, x2, y2, ....... Таким образом, я не могу определить, из какого файла он поступил. Я хочу установить имя столбца в качестве имени файла, из которого он читается, поэтому я попробовал это:

file_list <- list.files("folder", full.names=TRUE,pattern = ".xls")
files<-tibble()
files<-map_dfc(file_list,.f=read_excel ,col_names=c("nm",file))

Но я получаю столбцы с тем же именем файла. У кого-нибудь есть идеи, как я могу сделать это автоматически?

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете извлечь имена файлов из символьных элементов 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
...