R语言dplyr group by分组计算无法得到组内总数占比问题求助
问题核心原因
你当前的SuccessRate计算错误,根源是分组逻辑的问题:你同时按segment和t5_pass_fail两个维度做了分组,每个分组内仅包含t5_pass_fail=0或t5_pass_fail=1的单一群体,无法直接拿到对应segment分组的总人数,且原代码中SuccessRate = ((t5_pass_fail = 1)/sum(t5_pass_fail))存在赋值符号误用(应该用==做判断)的语法错误。
修复方案
只需要在分组计算子组指标前,先按segment单独分组计算每个segment的总人数,再带入后续的子组占比计算即可,完整修改后的代码如下:
Task5_Strict <- cleanuxq4 %>% dplyr::select(urespid_0, segment, starts_with("t")) %>% # 第一步:先按segment分组,计算该分组所有用户的总人数 group_by(segment) %>% mutate(segment_total = n()) %>% # 第二步:再按segment + t5_pass_fail双维度分组计算各子组指标 group_by(segment, t5_pass_fail) %>% summarize( Task = "Task5", N = n(), # 这里计算的是当前t5_pass_fail群体在所属segment中的占比,t5_pass_fail=1行的结果即为你要的成功率 SuccessRate = N / first(segment_total), UniquePages = mean(t5_unique_pageviews), Timedout_percent = sum(t5_effectiveness)/N, TimeonTask = mean(t5_time_task)/60, Clicks = mean(t5_clicks), Useful_raw = mean(t5_useful), Useful_percent = Useful_raw/7, UserFriendly_raw = mean(t5_user_friendly), UserFriendly_percent = UserFriendly_raw/7, Learned_raw = mean(t5_learned), Learned_percent = Learned_raw/7, Satisfied_raw = mean(t5_satisfied), Satisfied_percent = Satisfied_raw/7, Confident_raw = mean(t5_confident), Confident_percent = Confident_raw/7, Experienced_Difficulty_raw = sum(t5_exp_difficulty), Experienced_Difficulty_percent = Experienced_Difficulty_raw/N, difficulty_level_raw = mean(t5_difficulty_level, na.rm=TRUE), difficulty_level_percent = difficulty_level_raw/7 ) # 你原有的转置生成宽表的逻辑可以保留 Task5_Strict <- Task5_Strict %>% select(Task, segment, everything()) Task5_Strict_Pivot <- as.data.frame(t(Task5_Strict)) colnames(Task5_Strict_Pivot) <- paste(Task5_Strict_Pivot[2,], Task5_Strict_Pivot[3,], sep = "_") Task5_Strict_Pivot <- Task5_Strict_Pivot[-c(2,3),]
可选调整
- 如果你只需要
t5_pass_fail=1对应的成功率,其余行的该字段留空,可以将SuccessRate的计算逻辑修改为:SuccessRate = ifelse(t5_pass_fail == 1, N / first(segment_total), NA_real_) - 如果你实际要计算的是
t1_pass_fail的成功率,把代码中所有对应t5的字段替换为t1即可。
内容的提问来源于stack exchange,提问作者mdutton27
相关产品推荐
相关产品推荐

