#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)
вместо этого.