使用R计算击球手双杀率均值及标准差问题求助
解决R语言中分组计算击球手被双杀均值的问题
看起来你遇到的核心问题是没有按击球手ID分组计算均值,而是直接对整个DP_FL列取了全局均值,所以每个击球手得到的结果都一样。我来帮你修正这个问题,一步步来:
先分析错误原因
你可能写了类似这样的代码:
# 错误示例:直接将全局均值赋值给所有行 df$Rate1 <- mean(df$DP_FL)
mean(df$DP_FL)会计算整个数据集里DP_FL的平均值,把这个单一值赋值给每一行的Rate1,自然所有击球手的结果都相同。
正确的分组计算方法
下面给你两种常用的实现方式,选你顺手的就行:
方法1:用dplyr包(新手友好,代码可读性高)
dplyr是处理分组数据的利器,先安装并加载包,然后按BAT_ID分组计算均值:
# 如果还没安装dplyr,先执行这行 install.packages("dplyr") library(dplyr) # 方法A:生成每个击球手的均值汇总表 player_dp_summary <- df %>% group_by(BAT_ID) %>% summarise( DP_mean = mean(DP_FL, na.rm = TRUE), # na.rm=TRUE处理可能的缺失值 total_records = n() # 可选:顺便统计每个击球手的总记录数 ) # 方法B:把均值添加回原数据集的每一行(方便后续分析) df_with_rate <- df %>% group_by(BAT_ID) %>% mutate(Rate1 = mean(DP_FL, na.rm = TRUE))
方法2:用Base R(无需额外安装包)
如果不想用第三方包,用Base R的ave()或aggregate()函数也能实现:
# 用ave()直接给原数据集添加分组均值列 df$Rate1 <- ave(df$DP_FL, df$BAT_ID, FUN = function(x) mean(x, na.rm = TRUE)) # 用aggregate()生成汇总表 player_dp_summary_base <- aggregate(DP_FL ~ BAT_ID, data = df, FUN = mean, na.rm = TRUE)
验证你的子集数据
用你给出的子集测试:
hanim001有3条FALSE记录,均值是0pujoa001和espid001各1条TRUE记录,均值是1- 其他击球手都是
FALSE,均值是0
这样每个击球手的Rate1就会对应自己的实际均值,不会再全部相同了。
后续计算整体均值和标准差
等你得到每个击球手的均值后,直接对汇总表的均值列计算即可:
# 计算所有击球手均值的整体平均值 overall_mean <- mean(player_dp_summary$DP_mean, na.rm = TRUE) # 计算整体标准差 overall_sd <- sd(player_dp_summary$DP_mean, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者bbgoldm
相关产品推荐
相关产品推荐

