如何在R中从nhlapi嵌套列表提取游戏信息生成数据框
提取NHL赛事嵌套列表生成统一数据框的解决方案
问题背景
使用R语言的nhlapi包调用nhl_schedule_seasons(2023)获取2023赛季NHL赛事信息,返回嵌套列表结构,其中dates下的games列表包含各场比赛的子数据框。此前尝试用purrr映射或循环提取时,要么无法合并为统一数据框,要么因子数据框列数不匹配报错:
Error in rbind(deparse.level, ...) : numbers of columns of arguments do not match
正确解决方案
核心问题是不同场次的子数据框可能存在列数差异,需要在合并时自动填充缺失列。以下是两种简洁的实现方式:
方法一:结合pluck、list_flatten与list_rbind
library(nhlapi) library(purrr) library(dplyr) # 获取赛程数据 schedule <- nhl_schedule_seasons(2023) # 提取并合并所有比赛数据 game_df <- schedule %>% pluck("dates") %>% # 提取顶层的dates列表 map("games") %>% # 从每个日期条目里提取games子列表 list_flatten() %>% # 将嵌套的games列表展平为单层列表 list_rbind(fill = TRUE) # 合并所有子数据框,自动为缺失列填充NA
方法二:使用map_dfr批量处理
library(nhlapi) library(purrr) library(dplyr) schedule <- nhl_schedule_seasons(2023) game_df <- schedule %>% pluck("dates") %>% map_dfr(function(date_item) { # 对每个日期的games列表进行合并,再按行绑定所有日期的结果 date_item$games %>% list_rbind(fill = TRUE) })
错误原因说明
之前循环报错是因为不同场次的子数据框列数不一致,rbind()要求所有输入数据框列数完全匹配,而list_rbind(fill = TRUE)或bind_rows(fill = TRUE)会自动处理这种差异,为缺失的列填充NA值,从而避免报错。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

