如何在R中循环传递game_pk调用baseballr获取逐投数据?
解决R循环调用baseballr获取逐投数据的问题
你的核心问题是错误地将game_pk向量包装成了单元素列表,导致循环时无法传入单个比赛ID。以下是正确的循环实现步骤:
1. 正确提取比赛ID向量
不需要把game_pk转成列表,直接提取向量即可:
PKs <- AAA$game_pk
这会得到一个长度为15的向量,每个元素对应一场比赛的唯一标识。
2. 初始化存储结果的容器
创建一个空列表来保存每场比赛的逐投数据(列表适合存储结构一致的多个数据集):
all_pbp <- list()
3. 实现for循环
写法一:按索引遍历
这种写法便于跟踪循环进度,适合调试:
for (i in seq_along(PKs)) { # 取出当前比赛的game_pk current_pk <- PKs[i] # 调用API获取逐投数据 pbp_data <- mlb_pbp_diff( game_pk = current_pk, start_timecode = "20230331", end_timecode = "20230331" ) # 将结果存入列表,用game_pk作为名称方便后续查找 all_pbp[[as.character(current_pk)]] <- pbp_data # 可选:添加1秒延迟,避免频繁请求触发API限制 Sys.sleep(1) }
写法二:直接遍历比赛ID
更简洁的写法,直接遍历向量中的每个元素:
all_pbp <- list() for (pk in PKs) { pbp_data <- mlb_pbp_diff( game_pk = pk, start_timecode = "20230331", end_timecode = "20230331" ) all_pbp[[as.character(pk)]] <- pbp_data Sys.sleep(1) }
错误原因分析
你之前用PKs <- list(AAA$game_pk)得到的是仅包含1个元素的列表,这个元素是完整的game_pk向量。循环时每次传入的是整个向量而非单个ID,导致mlb_pbp_diff函数无法识别,从而执行失败。
后续处理(可选)
如果需要将所有比赛的逐投数据合并成单个数据框,可以用以下方法:
# 使用dplyr包 library(dplyr) combined_pbp <- bind_rows(all_pbp) # 或者使用data.table包(效率更高) library(data.table) combined_pbp <- rbindlist(all_pbp)
内容的提问来源于stack exchange,提问作者rcpikeboy
相关产品推荐
相关产品推荐

