Используйте R для записи нескольких листов в Excel с динамическими именами листов

#r #lapply #r-xlsx

#r #lapply #r-xlsx

Вопрос:

Это можно легко сделать с помощью for цикла, но я ищу решение с lapply помощью or dplyr .

У меня есть несколько фреймов данных, которые я хочу экспортировать в файл Excel на отдельных листах (я видел много вопросов и ответов по похожим строкам, но не смог найти ни одного, который бы динамически адресовал листы именования).

Я хочу назвать лист по имени фрейма данных. Для простоты я назвал фреймы данных шаблоном (скажем, от df1 до df10). Как мне это сделать?

Ниже приведен воспроизводимый пример с моей попыткой с двумя mtcars фреймами данных и cars (который работает, но без хороших имен листов).

 names_of_dfs=c('mtcars','cars') 
# variable 'combined' below will have all dfs separately stored in it
combined = lapply(as.list(names_of_dfs), get)
names(combined)=names_of_dfs # naming the list but unable to use below

multi.export=function(df,filename){
  return(xlsx::write.xlsx(df,file = filename,
                          sheetName = paste0('sheet',sample(c(1:200),1)),
                          append = T))
}

lapply(combined, function(x) multi.export(x,filename='combined.xlsx'))
 

Если это можно сделать проще с помощью какого-либо другого пакета r, пожалуйста, предложите.

Ответ №1:

Вот подход с writexl :

 library(writexl)
write_xlsx(setNames(lapply(names_of_dfs,get),names_of_dfs),
           path = "Test.xlsx")
 

Нам нужно использовать setNames , потому что имена листов задаются из имен списков. В противном случае lapply возвращаемый список без имен приведет к именам листов по умолчанию.

Комментарии:

1. Спасибо. Я не знал об setNames этом (я искал что-то подобное). Не использовал ваше решение, так как я не очень знаком с этим пакетом, и я получил другой ответ. Но я уверен, что это тоже работает, так что еще раз спасибо 🙂

2. Этот метод более лаконичен. Он просто берет список из R и экспортирует в файл Excel.

3. @Steve: Я понял это позже. Я был слишком ленив, чтобы исследовать новый пакет, и поэтому зависел xlsx от ответа на основе. Но на самом деле это аккуратнее.

Ответ №2:

Попробуйте что-то вроде этого:

 library(xlsx)
#Workbook
wb = createWorkbook()
#Lapply
lapply(names(combined), function(s) {
  sht = createSheet(wb, s)
  addDataFrame(combined[[s]], sht)
})
saveWorkbook(wb, "combined.xlsx")
 

Комментарии:

1. Спасибо! Это работает. После этого ответа я понял, что мне даже не нужно создавать список всех моих dfs. В addDataFrame Я использовал get(s) вместо этого.