如何计算DataFrame中各Rank下未完成状态的占比/比率
嘿,我来帮你搞定这个占比计算的问题!根据你给出的数据结构和需求,这里提供两种符合场景的实现方式,你可以根据实际需要选择:
场景1:计算未完成状态在「已完成+未完成」总数中的占比
如果是要算未完成数占该Rank下总任务数的比例,用dplyr分组计算就很方便:
library(dplyr) # 假设你的原始聚合数据框名叫df result_df <- df %>% group_by(Rank) %>% # 先计算每个Rank的总任务数(已完成+未完成) mutate(total_tasks = sum(`n()`), # 只在未完成行计算占比,其他行留NA ratio = ifelse(Status == "Incomplete", `n()` / total_tasks, NA)) %>% ungroup()
场景2:计算未完成状态与已完成状态的比率(和你示例格式一致)
要是你需要的是未完成数÷已完成数的比率(就像你示例里A行的602/9443),可以用分组提取对应值的方式实现:
result_df <- df %>% group_by(Rank) %>% # 提取当前Rank下的未完成和已完成计数 mutate(incomplete_num = `n()`[Status == "Incomplete"], complete_num = `n()`[Status == "Complete"], # 在已完成行显示比率,未完成行留空标记 ratio = ifelse(Status == "Complete", incomplete_num / complete_num, "----")) %>% # 移除中间临时变量 select(-incomplete_num, -complete_num) %>% ungroup()
额外优化:格式化比率显示
如果想让比率更易读(比如保留4位小数,或者显示成分数格式),可以调整ratio的计算逻辑:
# 保留4位小数 result_df <- result_df %>% mutate(ratio = ifelse(ratio != "----", round(as.numeric(ratio), 4), ratio)) # 显示成分数字符串(比如"602/9443") result_df <- df %>% group_by(Rank) %>% mutate(incomplete_num = `n()`[Status == "Incomplete"], complete_num = `n()`[Status == "Complete"], ratio = ifelse(Status == "Complete", paste0(incomplete_num, "/", complete_num), "----")) %>% select(-incomplete_num, -complete_num) %>% ungroup()
注意:如果你的数据里存在某个Rank只有一种状态的情况,可以用replace_na()处理缺失值,避免计算出错哦~
内容的提问来源于stack exchange,提问作者Garfield
相关产品推荐
相关产品推荐

