R处理Retrosheet棒球数据时group_by分组聚合结果一致问题求助
问题原因
- 核心原因是
dplyr和plyr两个扩展包存在同名函数冲突:你的代码使用了plyr包提供的ldply函数,说明运行环境中已经加载了plyr。如果dplyr的加载顺序早于plyr,环境中调用的summarize函数实际是plyr::summarize,该函数无法识别dplyr::group_by生成的分组属性,因此无论如何设置分组条件,都会直接计算全局的HomeRunsScore总和,返回结果自然完全相同。 - 次要兼容问题:
ldply生成的普通base R数据框,在部分旧版本dplyr中也可能偶发分组识别异常。
修复方案
你可以任选以下任意一种方案解决问题:
方案1:显式指定dplyr函数
调用summarize时显式声明使用dplyr版本,即可正确识别分组属性:
ll_data_frame %>% group_by(DayOfWeek) %>% dplyr::summarize(R = sum(HomeRunsScore))
方案2:调整包加载顺序
如果需要同时使用两个包的功能,将dplyr的加载顺序放在plyr之后,默认调用的同名函数就会是dplyr版本:
# 先加载plyr,再加载dplyr library(plyr) library(dplyr)
方案3(更推荐):全流程使用tidyverse语法
完全替换plyr相关函数,使用purrr::map_dfr直接拼接读取的多个文件,从根源上避免包冲突问题:
ll = list.files(pattern = "*.TXT") mycols <- read_csv("game_log_header.csv") %>% names() ll_data_frame <- purrr::map_dfr(ll, read_delim, col_names = mycols, delim = ",", na = character())
修改完成后,原有分组汇总代码无需额外调整即可正常运行。
内容的提问来源于stack exchange,提问作者Wingg23
相关产品推荐
相关产品推荐

