R语言按col_id分组计算col_assessment列值一致性占比实现方法
R分组计算评估值一致性占比的解决方案
问题排查
现有代码存在两处错误:
- 自定义
compute_ICR函数逻辑错误:传入的coding_values是向量类型,nrow()对向量返回空值,导致分母计算失败,需要替换为length()获取向量总长度 - 分组调用语法错误:
summarize中写df$col_assessment会提取整个数据框的全量列,不会按分组取子集,直接写列名col_assessment即可
注:你提供的示例数据中id=2的评估值为
Neu、Neg、Neu,最多值出现2次,实际计算得占比为0.6667,和你给出的期望输出中id=2占比为1不符,属于示例数据笔误,调整id=2的三个评估值为相同即可得到占比1的结果。
修正后的方案
方案1:沿用自定义函数的写法
library(dplyr) library(magrittr) # 示例数据 df <- data.frame(col_id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), col_assessment = c("Pos", "Pos", "Neu", "Neu", "Neg", "Neu", "Pos", "Neu", "Neg")) # 修正后的自定义函数 compute_ICR <- function(coding_values){ most_common_value <- coding_values %>% table() %>% sort(decreasing = TRUE) %>% extract(1) %>% names() share_accordance <- length(which(coding_values == most_common_value)) / length(coding_values) return(share_accordance) } # 分组调用计算 result <- df %>% group_by(col_id) %>% summarize(share_accordance = compute_ICR(col_assessment))
运行后输出结果:
# A tibble: 3 × 2 col_id share_accordance <dbl> <dbl> 1 1 0.667 2 2 0.667 3 3 0.333
方案2:无需自定义函数的简洁写法
直接用dplyr自带函数分组计数后计算,运行效率更高:
result <- df %>% group_by(col_id, col_assessment) %>% count() %>% group_by(col_id) %>% summarize(share_accordance = max(n)/sum(n))
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

