You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用dplyr管道对dataframe的各country_ID子组分别计算RMSE

按国家分组计算RMSE的dplyr实现方案

原始数据集示例

这是我的数据集my_data:

p0  | country_ID | WinFlag | 
----------------------------
0.17| UK         | 0       |
0.85| GER        | 1       |
0.55| USA        | 0       |
0.25| USA        | 0       |
0.80| UK         | 1       |

还有更多同结构数据。

全局RMSE计算实现

已经通过如下代码成功计算出my_data的整体RMSE:

test <- my_data %>%
      group_by(predic = round(p0, digits = 2)) %>%
      summarize(count = n(), wf = mean(WinFlag)) %>%
      mutate(vwap_err_sq = ((predic-wf)^2)*count)

rmse_p0 <- sqrt(sum(test$vwap_err_sq) / sum(test$count))*100

计算得到的test表示例如下:

predic  count  wf    vwap_err_sq
            <dbl> <int>  <dbl>       <dbl>
         1   0.04     6 0          0.0096 
         2   0.05     8 0.125      0.045  
         3   0.06    19 0.158      0.182  
         4   0.07    20 0.2        0.338  

需求说明

需要为my_data中每个country_ID对应的子组分别计算专属RMSE,此前多次尝试在上述代码中添加group_by(country_ID)都无法成功输出各国家对应的RMSE。

可复现示例与最终解决方案

测试数据集

library(tidyverse)

my_data <- data.frame(p0 = c(0.17,0.17,0.85,0.55,0.25,0.80),
                      country_ID=c("UK","UK","GER","USA","USA","UK"),
                      WinFlag=c(1,0,1,0,0,1))

分组计算RMSE代码

test <- my_data %>%
  group_by(predic = round(p0, digits = 2)) %>%
  mutate(count = 1) %>%
  mutate(wf = mean(WinFlag)) %>%
  mutate(vwap_err_sq = ((predic-wf)^2)*1) %>%
  ungroup() %>%
  group_by(country_ID) %>%
  mutate(rmse_p0 = sqrt(sum(vwap_err_sq*count) / sum(count))*100)

实现逻辑说明

原先全局计算用了summarize函数,会丢弃分组外的其他字段,导致后续无法保留country_ID信息做二次分组。调整方法是把第一步的summarize替换为mutate,保留所有行和国家字段,先按预测值分箱计算每个分箱的实际胜率和误差平方,解除分箱分组后再按国家维度分组汇总,即可算出每个国家的专属RMSE。


内容的提问来源于stack exchange,提问作者user2165379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 04:36:03