如何在R中按组计算相对频率及组内相对频率总和?
解决方案:实现分组相对频率及求和需求
当然可以实现这个需求!下面是基于你已有的数据框,用dplyr包完成的代码方案,完美贴合你想要的输出:
library(dplyr) # 处理数据,生成IdealOutput列 LikelyRenew_ReasonB_processed <- LikelyRenew_ReasonB %>% group_by(Name) %>% # 提取每组x=4对应的cum_Sum作为分组总分母 mutate(group_denominator = cum_Sum[x == 4], # 计算相对频率(转百分比,保留两位小数) rel_freq = round(freq / group_denominator * 100, 2)) %>% # 生成目标输出列:x≠4时用相对频率,x=4时用前3行相对频率的总和 mutate(IdealOutput = ifelse(x != 4, rel_freq, sum(rel_freq[x %in% 1:3], na.rm = TRUE))) %>% ungroup() # 查看处理后的结果(以costC组为例) LikelyRenew_ReasonB_processed %>% filter(Name == "costC")
代码解释:
- 分组处理:用
group_by(Name)确保每个Name组独立计算,不会互相干扰 - 获取分组分母:
group_denominator提取每组中x=4对应的cum_Sum值(也就是你示例中的187),作为该组所有行的计算分母 - 计算相对频率:
rel_freq把freq除以分组分母,转成百分比并保留两位小数,和你给出的示例格式一致 - 生成目标列:
IdealOutput通过ifelse判断,非x=4的行直接用相对频率;x=4的行则求和该组x=1到3的相对频率
处理后costC组的输出示例:
# A tibble: 4 × 6 Name x freq cum_Sum group_denominator rel_freq IdealOutput <chr> <dbl> <int> <int> <int> <dbl> <dbl> 1 costC 1 10 10 187 5.35 5.35 2 costC 2 11 21 187 5.88 5.88 3 costC 3 17 38 187 9.09 9.09 4 costC 4 149 187 187 79.6 20.32
内容的提问来源于stack exchange,提问作者Ellie




