Как объединить несколько файлов Excel с несколькими листами в один файл Excel с несколькими листами в R - PullRequest
1 голос
/ 21 сентября 2019

У меня есть несколько имен файлов, например, C1.xlsx;C2.xlsx;C3.xlsx;C4.xlsx и т. Д., Где каждый файл имеет несколько рабочих листов, таких как C_1;C_2;C_3 и т. Д., Т. Е. Имена листов во всех файлах одинаковы, а количество листов во всех файлах одинаково.Теперь мне нужно объединить все листы с одинаковыми именами из всех файлов.Кроме того, имена столбцов на каждом листе одинаковы.

Я использую следующий код для чтения всех файлов Excel в папке

library(readxl)

files <- list.files(path = "~/Dropbox/Data/multiple_files", pattern = 
"*.xlsx", full.names = T)

tbl <- sapply(files, read_excel, simplify=FALSE) %>% 
bind_rows(.id = "id")

файлы Excel, которые у меня есть, как показанониже:

C1.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E       A  B  C  D  E
1  4  6  8  C_1             2  4  6  1  C_2     1  4  6  8  C_3
3  56 7  8  C_1             2  3  6  8  C_2     2  3  5  6  C_3
2  4  6  1  C_1             7  8  3  4  C_2     3  4  6  7  C_3

C2.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E      A  B  C  D  E
3  7  1  3  C_1             1  4  7  1  C_2    1  9  6  1  C_3
1  6  9  2  C_1             2  3  6  8  C_2    2  3  5  6  C_3
2  4  6  1  C_1             7  1  3  4  C_2    3  4  2  7  C_3

C3.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E      A  B  C  D  E
9  4  6  8  C_1             1  4  6  1  C_2    1  4  1  1  C_3
3  5  7  1  C_1             1  3  6  4  C_2    2  1  5  1  C_3
2  7  6  1  C_1             7  7  3  4  C_2    3  4  6  7  C_3

Ожидается, что комбинированные таблицы в файле Excel будут такими, как показано ниже:

Combined.xlsx (worksheet:C_1)   (worksheet:C_2)   (worksheet:C_3)
A  B  C  D  E               A  B  C  D  E        A  B  C  D  E
1  4  6  8  C_1             2  4  6  1  C_2      1  4  6  8  C_3
3  56 7  8  C_1             2  3  6  8  C_2      2  3  5  6  C_3
2  4  6  1  C_1             7  8  3  4  C_2      3  4  6  7  C_3
3  7  1  3  C_1             1  4  7  1  C_2      1  9  6  1  C_3
1  6  9  2  C_1             2  3  6  8  C_2      2  3  5  6  C_3
2  4  6  1  C_1             7  1  3  4  C_2      3  4  2  7  C_3
9  4  6  8  C_1             1  4  6  1  C_2      1  4  1  1  C_3
3  5  7  1  C_1             1  3  6  4  C_2      2  1  5  1  C_3
2  7  6  1  C_1             7  7  3  4  C_2      3  4  6  7  C_3

Я ищу код для первого чтения всех файлов Excel в файле.папку, а затем объединить рабочие листы

заранее спасибо

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

для упорядочивания списка фреймов данных я использовал следующий код

sorted_bound_ss <- lapply(combined, function(C_1){
 C_1[order(C_1$A),]
})

это сработало ....

1 голос
/ 21 сентября 2019

openxlsx или writexl будут работать.Я думаю writexl немного быстрее.Из документации:

Записывает фрейм данных в файл xlsx.Чтобы создать xlsx с (несколькими) именованными листами, просто установите x на именованный список фреймов данных.

Следующий код «должен» работать:

spreadsheets <- purrr::map(files, function(.x){
  .spreadsheet <- purrr::map(1:3, .file = .x, function(.x, .file){
    .sheet <- readxl::read_xlsx(.file, sheet = .x)
  })
})
bound_ss <- purrr::map(1:3, .spreadsheet = spreadsheets, function(.x, .spreadsheet){
    do.call("rbind", purrr::map(.spreadsheet,.ind = .x, function(.x, .ind){
      purrr::pluck(.x, .ind)
      }))
})
# Should be a list of three sheets in the long format you expect
names(bound_ss) <- paste0("Sheet", 1:3)
  writexl::write_xlsx(bound_ss, path = "~/Dropbox/Data/multiple_files/sheet.xlsx")

## Sorting based on a column C1
library(magrittr)
bound_ss %<>% purrr::map(~ dplyr::arrange(.x, C1)) # ascending
bound_ss %<>% purrr::map(~ dplyr::arrange(.x, dplyr::desc(C1))) # descending
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...