R语言如何筛选≥50%答题率受访者并统计各部门员工答题占比
调研数据按组织单元统计普通员工答题占比的实现方案
基础数据说明
我基于正在开展的调研构建了一个tibble,字段规则如下:
- 6道答题字段:
Q1~Q6,每道题共2个选项 - 组织单元字段:
Org_unit,取值范围1-4,对应4个不同的组织 - 人员类型字段:
Manager,取值1代表管理人员,2代表普通员工 - 原始数据中
-9代表未作答,已统一替换为NA
基础数据构造代码:
library(dplyr) Org_unit <- c(1,1,1,1,2,2,2,3,3,4) Manager <- c(1,1,2,2,1,1,1,1,2,2) Q1 <- c(1,2,1,2,1,2,1,2,1,2) Q2 <- c(1,-9,-9,-9,-9,-9,-9,-9,-9,-9) #Note one response Q3 <- c(1,1,2,-9,-9,2,1,1, -9, 1) Q4 <- c(1,1,-9,1,2,2,-9,1,-9,2) Q5 <- c(1,-9,-9,-9,-9,-9,-9,-9,-9,-9) Q6 <- c(1,-9,-9,-9,-9,-9,-9,-9,-9,-9) df <- tibble(Org_unit, Manager, Q1, Q2, Q3, Q4, Q5, Q6) df[df == -9] <- NA df
统计规则说明
需要实现按组织单元统计普通员工的答题占比,规则如下:
- 仅统计
Manager == 2的普通员工样本 - 受访者有效答题率≥50%才可计入统计基数(总题量为6,即至少3道题有作答)
- 无符合条件样本的组织单元仍需保留在结果中,对应统计字段值为
NA - 每个题目统计的是符合条件的样本中选1的人数占比
原有代码的问题
原有统计代码没有过滤低答题率的受访者,且不会保留无符合条件样本的组织单元:
# 原有代码 prop <-df %>% group_by(Org_unit) %>% filter(Manager == 2) %>% summarise(N = n(), across(c(Q1, Q2, Q3, Q4, Q5, Q6), ~mean(. == 1)))
修正后的实现代码
需要先逐行计算受访者的有效答题率,过滤符合要求的样本后再分组统计,同时补全所有组织单元:
library(dplyr) library(tidyr) # 固定总题量为6 total_questions <- 6 prop <- df %>% # 先筛选普通员工样本 filter(Manager == 2) %>% # 逐行计算每个受访者的有效答题率 rowwise() %>% mutate(valid_rate = sum(!is.na(c_across(Q1:Q6))) / total_questions) %>% ungroup() %>% # 仅保留答题率达标的样本 filter(valid_rate >= 0.5) %>% # 按组织单元分组统计 group_by(Org_unit) %>% summarise( N = n(), across(Q1:Q6, ~mean(. == 1, na.rm = TRUE)) ) %>% # 补全所有4个组织单元,无数据的自动填充NA complete(Org_unit = 1:4) %>% # 把样本量为0的N替换为NA,符合输出要求 mutate(N = ifelse(N == 0, NA_integer_, N))
输出结果
运行上述代码后得到的结果和预期一致:
> prop # A tibble: 4 × 8 Org_unit N Q1 Q2 Q3 Q4 Q5 Q6 <int> <int> <dbl> <lgl> <dbl> <dbl> <lgl> <lgl> 1 1 NA NA NA NA NA NA NA 2 2 NA NA NA NA NA NA NA 3 3 NA NA NA NA NA NA NA 4 4 1 0 NA 1 0 NA NA
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

