Использование write.xlsx внутри lapply для записи каждого фрейма данных в глобальной среде на каждую вкладку одного файла Excel - PullRequest
0 голосов
/ 05 июня 2018

Моя глобальная среда в R Studio состоит из нескольких фреймов данных.Я хотел бы записать данные в каждом фрейме данных на каждую вкладку в одном файле Excel.

Чтобы сделать этот вопрос воспроизводимым, давайте рассмотрим следующие фреймы данных в глобальной среде:

df1 <- data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6))
df2 <- data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4))
df3 <- data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7))
df4 <- data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))

Требуемый вывод - это один файл Excel с 4 вкладками, первая вкладка которого называется "df1" и содержит данные df1 и т. Д. И т. Д.

Я пробовал следующее, но онивсе не работают:

lapply(ls(), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))

lapply(names(ls()), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))

lapply(names(ls()), function(x) write.xlsx(ls[[x]], "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))

Я знаю, что в Stackoverflow есть решения для моего запроса, использующие цикл for.Однако не существует решений, в которых семейство функций apply (например, lapply) используется для получения ответа.

Оцените любую помощь, использующую lapply для решения этой проблемы.Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Проблема в том, что ls() возвращает символьные значения, а не фреймы данных.Таким образом, ни один из используемых вами кодов фактически не обращается к самим фреймам данных.Кроме того, очень опасно использовать ls(), так как он добавит каждый объект в вашу глобальную среду.

Начните с помещения ваших фреймов данных в список:

alldf <- list(
  df1 = data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6)),
  df2 = data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4)),
  df3 = data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7)),
  df4 = data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))
)

Как только вы это сделаете, вы можете просто использовать write.xlsx() из пакета openxlsx, например:

library(openxlsx)
write.xlsx(alldf, "text.xlsx")

Он также автоматически установит имена.

Если вам нужно создать этот список из вашей глобальной среды, вы можете сделать что-то вроде этого:

allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]
0 голосов
/ 05 июня 2018

Сначала мы создаем пустой .xlsx для добавления наших листов:

library(xlsx)
wb = xlsx::createWorkbook(type='xlsx')
saveWorkbook(wb,"Overall_Output.xlsx")
rm(wb)#remove wb to avoid it in ls()

Затем мы вызываем каждый фрейм данных по имени, используя функцию get0 ():

lapply(ls(), function(x) write.xlsx(get0(x), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...