如何使用 ReadXL 和 Tidyverse 将 Table 列表中的每个分组 Table 导出到不同的 Excel 选项卡

How to Export Each Grouped Table in a List of Tables to a Different Excel Tab Using ReadXL and Tidyverse

library(dplyr)
library(tidyr)
library(forcats)
library(readxl)    

使用 forcats 包中的 gss_cat 数据集,我创建了一个分组和汇总的数据框,然后将数据按婚姻和种族变量拆分(如果有比在这里使用 lapply 更好的 tidyverse 方法将是一个很好的奖励)。

Survey<-gss_cat%>%
select(marital,race,relig,denom)%>%
group_by(marital,race,relig,denom)%>%
summarise(Count=n())%>%
mutate(Perc=paste0(round(100*Count/sum(Count),2),"%"))%>%
drop_na()

Survey%>%split(.$marital)%>%
lapply(function(x) split(x,x$race))

但是我一直在尝试使用 readxl 将最终列表导出到 Excel 文件。更具体地说,我想导出列表中的 select 个表以分隔 Excel 个选项卡。例如,按种族划分,以便每个种族类别位于电子表格中的不同选项卡上。

首先,readxl不写Excel文件。推荐使用 the thread for issue 231 on the readxl GitHub page. It looks like the writexl 包([还]不是 tidyverse 的一部分)。

其次,split()可以将列表作为参数。

list_of_dfs <- survey %>% split(list(.$marital, .$race), sep='_')

把它放在一起,假设你已经安装了 writexl:

require(tidyverse) 
require(forcats)
require(writexl)

survey <- 
    gss_cat %>%
        select(marital, race, relig, denom) %>%
        group_by(marital, race, relig, denom) %>%
        summarise(Count=n()) %>%
        mutate(Perc=paste0(round(100*Count/sum(Count), 2), "%")) %>%
        drop_na()

list_of_dfs <- survey %>% split(list(.$marital, .$race), sep='_')

write_xlsx(list_of_dfs, 'out.xlsx')

请注意,没有检查 write_xlsx 尝试创建的工作表名称的适用性。如果您的数据在 maritalrace 列中包含非法字符,或者如果您在 split()sep 参数中使用了非法字符,则操作将失败。 (如果您不相信我,请尝试使用 sep = ':'。)