对多列中的因子使用自定义汇总函数

Using a custom summary function for factors within multiple columns

我对大量项目进行了调查,每个项目都有不同的分类响应选项存储为因素。我需要以有效的方式总结这些专栏,最好使用 forcats::fct_count() 提供的功能。我还需要知道为每个变量提供了多少非 NA 响应,因为向不同的受访者显示了不同的项目。我写了一个函数来制作一个整洁的小摘要数据框,但是 我正在努力有效地 运行 这个函数沿着每一列,然后将结果组合成一个对象(ala 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)

也许您正在寻找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