我进行了一项包含大量项目的调查,每个项目都有不同的分类响应选项存储为因素。我需要以一种有效的方式总结这些列,最好是具有类似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)