R:自动导出多个数据帧列表

问题描述 投票:0回答:1

我有一个数据框列表,想根据列值将它们导出到单独的电子表格中。这是一个例子:

DF <- data.frame(Company=c('Alpha', 'Alpha', 'Alpha', 'Beta', 'Beta', 'Gamma', 'Epsilon'),
                 Location=c('NY', 'NY', 'CHI', 'LA', 'CHI','LA', 'LA' ),
                 ID=c('1234', '1234', '1234', '5678', '5678', '2468', '2468'),
                 Charge=c(25,25,51, 60,60, 15, 15))

DF2 <- data.frame(Company=c('Alpha', 'Alpha', 'Beta', 'Beta', 'Delta', 'Delta', 'Delta'),
                  Location=c('NY', 'NY', 'CHI', 'LA', 'CHI','LA', 'LA' ),
                  ID=c('1234', '1234', '1234', '5678', '4567', '4567', '4567'),
                  Charge=c(25,25,51, 60,60, 15, 15))


DF3 <- data.frame(Company=c('Alpha', 'Alpha', 'Beta', 'Delta', 'Delta','Delta','Delta'),
                  Location=c('NY', 'NY', 'CHI', 'LA', 'CHI','LA', 'LA' ),
                  ID=c('1234', '1234', '1234', '5678', '4567', '6789', '6789'),
                  Charge=c(25,25,51, 60,60, 15, 15))

当我使用下面的代码按公司拆分时,我收到错误,因为公司名称不在每个数据框中。

list(
  DF, DF2, DF3
) %>%
  purrr::set_names(paste("SpreadsheetA"), paste("SpreadsheetB"), paste("SpreadsheetC"), paste("SpreadsheetD")) %>% 
  purrr::map(~ split(.x, .x$Company)) %>%
  purrr::transpose() %>%
  purrr::iwalk(~writexl::write_xlsx(.x, file.path(path, paste0("results_", .y, ".xlsx"))))

每个导出的 Excel 文档的电子表格必须具有相同的名称。我希望最终结果是,即使公司没有出现在电子表格 A、B、C 或 D 中,我也希望按公司名称自动导出 excel 文档。例如,我将有一个 excel 文档,其中仅包含3 个电子表格而不是 4 个。我非常感谢任何帮助。谢谢!

r dataframe split export purrr
1个回答
1
投票

问题是

write_xlsx
(如错误代码所述)需要“数据帧或数据帧列表”。 NULL 不是数据帧。

library(tidyverse)
library(writexl)

path <- "~/Downloads"

list(DF, DF2, DF3) %>%
  set_names(c("SpreadsheetA", "SpreadsheetB", "SpreadsheetC")) %>% # you can't give four names to three items, it just doesn't make any sense
  map(~ split(.x, .x$Company)) %>%
  transpose() %>%
  map(~ .x[!map_lgl(.x, is.null)]) %>%  # remove all NULL values
  iwalk(~writexl::write_xlsx(.x, file.path(path, paste0("results_", .y, ".xlsx"))))
© www.soinside.com 2019 - 2024. All rights reserved.