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

R如何从子数据框列表中筛选指定列数的表并处理异常列名

R 爬取篮球比赛统计数据的清洗合并方案

问题场景

用户从basketball-reference网站爬取2016年篮球比赛技术统计数据,解析HTML表格后得到列表对象box_scores_2016,其中包含多个子数据框,需要实现两个需求:

  • 仅保留恰好包含全部21个指定列的子数据框,合并为单个数据框,目标列包括:Starters、MP、FG、FGA、FG%、3P、3PA、3P%、FT、FTA、FT%、ORB、DRB、TRB、AST、STL、BLK、TOV、PF、PTS、+/-
  • 处理部分子数据框中带HTML属性的异常长列名(例:"True Shooting PercentageA measure of shooting efficiency that takes into account 2-point field goals, 3-point field goals, and free throws." data-over-header="Advanced Box Score Stats" >TS%)

之前的实现问题:仅按列名匹配筛选,未校验是否包含全部目标列,导致列数不足的子数据框也被纳入合并结果。

解决代码

步骤1:定义目标列与依赖加载

library(data.table)
# 定义21个目标列
target_cols <- c("Starters", "MP", "FG", "FGA", "FG%", "3P", "3PA", 
                 "3P%", "FT", "FTA", "FT%", "ORB", "DRB", "TRB", "AST", 
                 "STL", "BLK", "TOV", "PF", "PTS", "+/-")

步骤2:统一清洗异常列名

box_scores_clean <- lapply(box_scores_2016, function(df) {
  # 正则提取列名末尾>后的有效短名称,无>的保留原名
  names(df) <- gsub("^.*>([^>]+)$", "\\1", names(df))
  return(df)
})

步骤3:筛选符合要求的子数据框

# 仅保留包含全部21个目标列的子数据框
box_scores_valid <- Filter(function(df) all(target_cols %in% names(df)), box_scores_clean)
# 统一保留目标列顺序,避免合并列错位
box_scores_valid <- lapply(box_scores_valid, function(df) df[, target_cols])

步骤4:合并为最终数据框

final_box_score <- rbindlist(box_scores_valid)

逻辑说明

  • 列名清洗的正则会自动剥离HTML属性等冗余内容,提取最终的标准统计项名称
  • 筛选逻辑使用all()判断子数据框是否包含全部目标列,从根源上排除列数不足的异常表
  • 统一指定列顺序后再合并,避免不同子数据框列顺序不同导致的合并错位

内容的提问来源于stack exchange,提问作者Anne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:21:03