Напишите несколько описаний по отдельным листам в книге Excel, используя openxlsx

У меня есть большой фрейм данных, который я суммирую несколькими способами, используя describeBy из библиотеки psych следующим образом:

library(tidyverse)
library(openxlsx)
library(psych)
.
.
.
 # Describe by Region
  lst1 <- describeBy(df[QUESTIONS], df[REGION_DESCRIPTOR])

  # Describe by Doctor
  lst2 <- describeBy(df[QUESTIONS], df[CARE_DESCRIPTOR])

Затем я создаю новую книгу

  wb = createWorkbook()

и начните пытаться записать в него lst1, lst2,...., по одному элементу на лист:

  addWorksheet(wb, REGION_DESCRIPTOR)
  writeData(wb, REGION_DESCRIPTOR, lst1)

  addWorksheet(wb, CARE_DESCRIPTOR)
  writeData(wb, CARE_DESCRIPTOR, lst2)

К сожалению, я получаю сообщение об ошибке:

Error in as.data.frame.default(x, stringsAsFactors = FALSE) : 
  cannot coerce class ‘c("psych", "describeBy")’ to a data.frame

Как я могу записать каждый объект describeBy на лист, используя openxlsx? Я пробовал использовать writexl, и хотя он работает, меня не устраивает тот факт, что он записывает каждую сводку, сгенерированную describeBy, на другой рабочий лист. Поскольку у меня есть около дюжины describeBy, каждая с 3-5 категориями, это быстро становится громоздким.

Заранее спасибо за вашу помощь

Томас Филипс


person Thomas Philips    schedule 07.08.2020    source источник
comment
Не могли бы вы вставить вывод dput(df) в вопрос, чтобы помочь вам!   -  person Duck    schedule 07.08.2020
comment
Можешь попробовать с do.call(rbind, describeBy(mtcars[, 'mpg'], mtcars[, 'vs']) )   -  person akrun    schedule 07.08.2020
comment
Попробуйте изменить структуру данных с psych и описатьBy на что-то более стандартное, например, на фрейм данных, прежде чем пытаться его записать/сохранить.   -  person Samuel    schedule 07.08.2020
comment
Вывод dput(lst1) слишком длинный для печати, но он начинается и заканчивается так: > dput(lst1) structure(list(ASIA_HIGH_INCOME = structure(list(vars = 1:17, n = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), ..., row.names = c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q13", "Q14", "Q15", "Q16", "Q17"))), .Dim = 10L, .Dimnames = list( Region = c("ASIA_HIGH_INCOME", "ASIA_MIDDLE_INCOME", ..., "WESTERN_EUROPE")), call = by.data.frame(data = x, INDICES = group, FUN = describe, type = type), class = c("psych", "describeBy"))   -  person Thomas Philips    schedule 07.08.2020


Ответы (1)


Объект, выходящий из describeBy, представляет собой list. Мы могли бы rbind соединить их в одну матрицу или data.frame, и это должно сработать.

do.call(rbind, describeBy(mtcars[, 'mpg'], mtcars[, 'vs']) )
person akrun    schedule 07.08.2020
comment
'do.call(rbind, descriptionBy(df[QUESTIONS, REGION_DESCRIPTOR], df[QUESTIONS, CARE_DESCRIPTOR])) Ошибка в do.call(rbind, descriptionBy(df[QUESTIONS, REGION_DESCRIPTOR], df[QUESTIONS, : второй аргумент должен быть список` - person Thomas Philips; 07.08.2020
comment
@ThomasPhilips Пример, который я показал, работает для меня. Ваш пример не воспроизводится для тестирования - person akrun; 07.08.2020
comment
Ваш пример действительно работает. Каждый из descriptionBy создает один столбец, который затем можно склеить вместе с помощью rbind. в моем случае я применяю описатьBy к 17 вопросам для каждого из дескрипторов. - person Thomas Philips; 07.08.2020
comment
@ThomasPhilips Вы имели в виду несколько групп? - person akrun; 07.08.2020
comment
Возможно, мне следует начать с более простого вопроса: как я могу написать одно описание, примененное к 17 вопросам на листе. У меня возникли трудности с созданием MWE, потому что проблема большая - person Thomas Philips; 07.08.2020
comment
Возможно, вы имели в виду do.call(rbind, describeBy(mtcars[c('disp','mpg')], mtcars[, 'vs'])), у меня тоже работает. «Disp», «mpg» соответствуют столбцам «Вопросы» в вашем случае. - person akrun; 07.08.2020
comment
Красиво работает! Мельница спасибо. Я никогда не использовал do.call, но прочитаю об этом еще раз Спасибо! - person Thomas Philips; 07.08.2020
comment
@ThomasPhilips Спасибо, но почему вы получили ошибку раньше - person akrun; 07.08.2020
comment
@ThomasPhilips, если столбцов больше, вам нужно объединить, то есть do.call(rbind, describeBy(mtcars[c('disp','mpg')], mtcars[c('vs', 'gear')])) - person akrun; 07.08.2020