R 对多列中的因子使用自定义摘要函数
我对大量项目进行了调查,每个项目都有不同的分类响应选项,存储为因子。我需要以有效的方式总结这些列,最好使用R 对多列中的因子使用自定义摘要函数,r,forcats,R,Forcats,我对大量项目进行了调查,每个项目都有不同的分类响应选项,存储为因子。我需要以有效的方式总结这些列,最好使用forcats::fct_count()提供的功能。我还需要知道为每个变量提供了多少非NA回答,因为不同的项目显示给不同的受访者。我写了一个函数来创建一个整洁的小摘要数据框,但是我努力沿着每一列高效地运行这个函数,然后将结果合并到一个对象中(aladdply) 我尝试了sapply(),gather()-将数据转换为长格式,然后运行ddply(),但每个变量的不同级别似乎一直是个问题。请参阅
forcats::fct_count()
提供的功能。我还需要知道为每个变量提供了多少非NA回答,因为不同的项目显示给不同的受访者。我写了一个函数来创建一个整洁的小摘要数据框,但是我努力沿着每一列高效地运行这个函数,然后将结果合并到一个对象中(aladdply
)
我尝试了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)
data也许您正在寻找purrr::map\u 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
map\u-dfr(数据[,2:ncol(数据)],factorssummaries.f,.id=“colname”)
#输出
colname f n
1 X 18号
2 X是17
3乘35
4 Y a 14
5 Y c 13
6 Y b 12
7 Y和39
8ZG10
9 Z d 9
10 Z h 8
11 Z f 6
12 Z e 5
13 Z和38