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
相关产品推荐
相关产品推荐

