Использование пользовательской сводной функции для факторов в нескольких столбцах

Я провел опрос с большим количеством элементов, каждый из которых имеет различные категориальные варианты ответа, сохраненные в виде факторов. Мне нужно суммировать эти столбцы эффективным образом, предпочтительно с такими функциями, которые предоставляются forcats::fct_count(), Мне также нужно знать, сколько ответов, не относящихся к NA, было предоставлено для каждой переменной, поскольку разные предметы были показаны разным респондентам. Я написал функцию для создания аккуратного небольшого итогового фрейма данных, но изо всех сил стараюсь эффективно запустить эту функцию вдоль каждого столбца, а затем объединить результаты в один объект (аля ddply )

я пробовал sapply(), gather() -в данных в длинном формате, а затем работает ddply(), но проблема отдельных уровней для каждой переменной, кажется, продолжает мешать. Ниже приведен воспроизводимый пример набора данных и моей функции суммирования. Я мог бы запустить функцию для каждой переменной (как показано ниже), но я знаю, что должен быть более эффективный способ сделать это, не включая создание тонны отдельных итоговых объектов фрейма данных. Спасибо за любую помощь, которую вы можете предоставить.

data <- data.frame(
  ID = c(1:50),
  X = as.factor(sample(c("yes", "no", NA), 50, replace = TRUE)),
  Y = as.factor(sample(c("a", "b", "c", NA), 50, replace = TRUE)),
  Z = as.factor(sample(c("d", "e", "f", "g", "h", NA), 50, replace = TRUE))
)

library(tidyverse)
library(forcats)

factorsummaries.f <- function(x) {
  x <- na.omit(x)
  counts <- fct_count(fct_drop(x), sort = T)
  counts$f <- as.character(counts$f)
  total <- data.frame(f = "sum", n = as.numeric(sum(counts$n)))
  return(bind_rows(counts, total))
}

factorsummaries.f(data$X)
factorsummaries.f(data$Y)

1 ответ

Решение

Возможно, вы ищете purrr::map_dfr

map_dfr(data[,2:ncol(data)], factorsummaries.f, .id = "colname")
#output  


 colname     f     n
   <chr> <chr> <dbl>
 1     X    no    18
 2     X   yes    17
 3     X   sum    35
 4     Y     a    14
 5     Y     c    13
 6     Y     b    12
 7     Y   sum    39
 8     Z     g    10
 9     Z     d     9
10     Z     h     8
11     Z     f     6
12     Z     e     5
13     Z   sum    38
Другие вопросы по тегам