You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求帮助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:12:01