Как экспортировать каждую сгруппированную таблицу в списке таблиц на другую вкладку Excel с помощью ReadXL и Tidyverse

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

Используя набор данных gss_cat из пакета forcats, я создал сгруппированный и обобщенный фрейм данных, а затем разделил данные по семейным и расовым переменным (если есть лучший метод tidyverse, чем использование здесь lapply, это было бы отличным бонусом).

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))

Однако я застрял, пытаясь экспортировать окончательный список в файл Excel с помощью readxl. В частности, я хочу экспортировать выбранные таблицы в список на отдельные вкладки Excel. Например, разделить по расам, чтобы каждая категория рас находилась на отдельной вкладке электронной таблицы.


person Mike    schedule 18.10.2017    source источник


Ответы (1)


Во-первых, readxl не записывает файлы Excel. См. тему по проблеме 231 на странице readxl GitHub. Похоже, вместо этого рекомендуется пакет 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 пытается создать. Если ваши данные содержали недопустимые символы в столбце marital или race или если вы использовали недопустимый символ в аргументе sep для split(), операция завершится ошибкой. (Попробуйте использовать sep = ':', если не верите мне.)

person Curt F.    schedule 05.11.2017