请求帮助:在R语言中读取赛事XML文件的代码方案
读取赛事XML文件的R实现方案
为什么xmlToDataFrame不适用?
你的XML是多层嵌套结构:Games → Game → Event → Q,xmlToDataFrame仅能处理简单的扁平XML结构,无法自动解析这种多层嵌套关系,所以需要用更灵活的XML处理工具。
所需工具包
我们使用xml2包解析XML,tidyverse包整理数据,先安装并加载:
# 首次运行需要安装包 install.packages(c("xml2", "tidyverse")) # 加载包 library(xml2) library(tidyverse)
完整解析代码
# 1. 读取XML文件 xml_file <- read_xml("data/5_Champions_League/F1/F1_20132014.xml") # 2. 提取Game层级的基础信息 game_data <- xml_file %>% xml_find_all("//Game") %>% map_df(~tibble( game_id = xml_attr(., "id"), away_score = xml_attr(., "away_score") %>% as.integer(), away_team_id = xml_attr(., "away_team_id") %>% as.integer(), away_team_name = xml_attr(., "away_team_name"), competition_id = xml_attr(., "competition_id") %>% as.integer(), competition_name = xml_attr(., "competition_name"), game_date = xml_attr(., "game_date") %>% as.POSIXct(), home_score = xml_attr(., "home_score") %>% as.integer(), home_team_id = xml_attr(., "home_team_id") %>% as.integer(), home_team_name = xml_attr(., "home_team_name"), matchday = xml_attr(., "matchday") %>% as.integer(), period_1_start = xml_attr(., "period_1_start") %>% as.POSIXct(), period_2_start = xml_attr(., "period_2_start") %>% as.POSIXct(), season_id = xml_attr(., "season_id") %>% as.integer(), season_name = xml_attr(., "season_name") )) # 3. 提取Event层级的信息,并关联Game ID event_data <- xml_file %>% xml_find_all("//Game") %>% map_df(function(game_node) { game_id <- xml_attr(game_node, "id") game_node %>% xml_find_all(".//Event") %>% map_df(~tibble( game_id = game_id, event_id = xml_attr(., "id"), event_type_id = xml_attr(., "type_id") %>% as.integer(), period_id = xml_attr(., "period_id") %>% as.integer(), min = xml_attr(., "min") %>% as.integer(), sec = xml_attr(., "sec") %>% as.integer(), team_id = xml_attr(., "team_id") %>% as.integer(), outcome = xml_attr(., "outcome") %>% as.integer(), x = xml_attr(., "x") %>% as.numeric(), y = xml_attr(., "y") %>% as.numeric(), timestamp = xml_attr(., "timestamp") %>% as.POSIXct(), last_modified = xml_attr(., "last_modified") %>% as.POSIXct(), player_id = xml_attr(., "player_id") %>% as.integer() # 处理可能缺失的属性 )) }) # 4. 提取Event下的Q标签( qualifier 信息),并关联Event ID qualifier_data <- xml_file %>% xml_find_all("//Event") %>% map_df(function(event_node) { event_id <- xml_attr(event_node, "id") event_node %>% xml_find_all(".//Q") %>% map_df(~tibble( event_id = event_id, qualifier_id = xml_attr(., "qualifier_id") %>% as.integer(), qualifier_value = xml_attr(., "value") )) }) # 5. (可选)将qualifier数据转换为宽格式,方便后续分析 qualifier_wide <- qualifier_data %>% pivot_wider(names_from = qualifier_id, values_from = qualifier_value, names_prefix = "qualifier_") # 6. 合并所有数据(按需选择合并方式) # 方式1:合并Game和Event数据 game_event_combined <- left_join(game_data, event_data, by = "game_id") # 方式2:合并所有三层数据 full_data <- left_join(game_event_combined, qualifier_wide, by = "event_id") # 查看结果 head(full_data)
代码说明
- 分层提取:分别提取
Game、Event、Q三层数据,确保每个层级的信息都被完整保留 - 类型转换:将数值、时间类属性转换为对应R数据类型,方便后续分析
- 灵活合并:提供两种合并方式,可根据实际需求选择使用扁平的合并数据,或者保留分层结构
内容的提问来源于stack exchange,提问作者Niklas Siewert
相关产品推荐
相关产品推荐

