R爬取NAIA棒球数据生成18个tibbles,合并后行数异常求助
解决NAIA棒球数据合并后队伍重复的问题
你遇到的核心问题是:页面返回的18个tibble并非独立数据集,而是同一199支队伍的不同统计维度表格——每个表格都包含199行(对应所有队伍)和专属统计列。bind_rows()会将表格按行堆叠,自然导致队伍重复18次,大量NA值则来自各表格独有的列在其他表格中不存在。
正确合并方式:按队伍列横向拼接
需要将所有表格按队伍名称横向整合,把同一队伍的所有统计项归到同一行。以下是两种可靠实现方式:
方法1:purrr::reduce + full_join(推荐,适配队伍顺序不一致场景)
该方法会自动按队伍名称匹配,即使不同表格的队伍排序有差异也能正确合并:
library(dplyr) library(rvest) library(purrr) url <- "https://naiastats.prestosports.com/sports/bsb/2022-23/teams" page <- read_html(url) data_tables <- page %>% html_nodes("table") %>% html_table() # 统一所有表格的第一列(队伍列)名称为"Team" data_tables <- map(data_tables, ~rename(.x, Team = 1)) # 按Team列逐步合并所有表格 combined_data <- reduce(data_tables, full_join, by = "Team")
方法2:bind_cols(仅当所有表格队伍顺序完全一致时使用)
若确认所有表格的队伍排序完全相同,可直接移除重复队伍列后横向拼接:
library(dplyr) library(rvest) library(purrr) url <- "https://naiastats.prestosports.com/sports/bsb/2022-23/teams" page <- read_html(url) data_tables <- page %>% html_nodes("table") %>% html_table() # 提取第一个表格的队伍列作为主列 team_column <- data_tables[[1]][, 1] # 移除所有表格中的队伍列 tables_without_team <- map(data_tables, ~select(.x, -1)) # 拼接队伍列和所有统计列 combined_data <- bind_cols(team_column, tables_without_team)
结果验证
合并完成后,运行nrow(combined_data)应返回199,每个队伍的所有统计数据会集中在同一行,NA值仅出现在该队伍确实无对应统计项的位置。
内容的提问来源于stack exchange,提问作者jhuff52
相关产品推荐
相关产品推荐

