尝试使用 ldply 将列表转换为数据帧时出错(错误(函数(...,row.names = NULL,:参数暗示行数不同:)

Error when trying to convert a list to dataframe using ldply (Error in (function (..., row.names = NULL, :arguments imply differing number of rows: )

我正在尝试使用 RStudio 抓取足球队球员的标准统计数据。我能够将信息提取到列表中,但无法将它们可视化为数据框,它给了我这个错误(错误(函数(...,row.names = NULL,check.rows = FALSE , check.names = 真, : 参数意味着不同的行数:33、27、24、35、5、4、54、38、18、2、1)我是 R 的菜鸟,我想不出解决它的方法,这是我正在使用的代码,以及我试图从中提取数据的页面,非常欢迎任何帮助!!!

https://fbref.com/en/squads/2b390eca/2016-2017/Athletic-Bilbao

install.packages('rvest')
install.packages('plyr')
install.packages('dplyr')
library(rvest)
library(plyr)
library(dplyr)

years = c(2017:2018)
urls = list()
for (i in 1:length(years)) {
  url = paste0('https://fbref.com/en/squads/2b390eca/',years[i],'-',years[i+1],'/Athletic-Bilbao')
  urls[[i]] = url #https://fbref.com/en/squads/d5348c80/',years1[i],'-',years2[i+1],'/AEK-Athens
}


tbl = list()
years = 2017
j = 1
for (j in seq_along(urls)) {
  tbl[[j]] = urls[[j]] %>%
    read_html() %>%
    html_nodes("table") %>%
    html_table()
  tbl[[j]]$Year = years
  j = j+1
  years = years+1
}

Data = ldply(tbl,data.frame)

我发现需要进行两个修复。

你的第二个 url 是错误的。我想,你想要 years[i] + 1 即在索引之外移动 + 1。然后你得到 2017-2018 和 2018-19.

其次,有许多 table 具有不同的行数和列数,当您只想要第一个(标准)时,您正试图将它们全部连接起来。如果您只想要第一个 table,那么使用 html_node 而不是 html_nodes,即 html_node("table")

我也不确定年份列是否按照您预期的方式设置,因为您目前会得到 2019 年和 2020 年。我已经更改,所以您得到 2017 年和 2018 年。您不需要递增j顺便说一句。

library(rvest)
library(plyr)
library(dplyr)

years = c(2017:2018)
urls = list()

for (i in 1:length(years)) {
  url = paste0('https://fbref.com/en/squads/2b390eca/',years[i],'-',years[i] + 1,'/Athletic-Bilbao')
  urls[[i]] = url 
}

tbl = list()

for (j in seq_along(urls)) {
  tbl[[j]] <- urls[[j]] %>%
              read_html() %>%
              html_node("table") %>%
              html_table()
  tbl[[j]]$Year = years[j]
}

data = ldply(tbl,data.frame)