为R语言read_prem_league函数添加Season列并解决报错问题
解决方法
报错原因
你直接用read_prem_league$Season <- year报错,是因为read_prem_league是函数(closure类型),不是数据框/tibble,函数不能用$来子集赋值——你应该操作函数内部生成的tibble数据,而不是函数本身。
正确实现步骤
- 生成正确的赛季格式字符串:输入的
year是赛季结束年份,比如2021对应2020-21赛季,所以用paste(year-1, substr(year,3,4), sep="-")生成格式字符串。 - 在函数内部处理数据:先获取原始的英超数据tibble,再插入Season列到Pos左侧。
修改后的函数示例
假设你原来的函数是用rvest爬取维基百科,修改后代码如下:
library(rvest) library(dplyr) read_prem_league <- function(year) { # 1. 获取原始英超赛季数据(保留你原来的爬取逻辑) season_url <- paste0("https://en.wikipedia.org/wiki/", year, "–", substr(year,3,4), "_Premier_League") raw_data <- season_url %>% read_html() %>% html_element("table.wikitable.sortable") %>% html_table(header = TRUE, fill = TRUE) %>% as_tibble() # 2. 生成目标赛季格式字符串 season_label <- paste(year - 1, substr(year, 3, 4), sep = "-") # 3. 在Pos列左侧插入Season列 final_data <- raw_data %>% add_column(Season = season_label, .before = "Pos") return(final_data) }
测试调用
运行read_prem_league(2021),就能得到带Season列(值为2020-21)且位于Pos左侧的tibble。
不用dplyr的base R替代方案
如果不想依赖dplyr,可以用base R实现:
read_prem_league <- function(year) { # 保留原始爬取逻辑,得到raw_data season_url <- paste0("https://en.wikipedia.org/wiki/", year, "–", substr(year,3,4), "_Premier_League") raw_data <- season_url %>% read_html() %>% html_element("table.wikitable.sortable") %>% html_table(header = TRUE, fill = TRUE) %>% as_tibble() season_label <- paste(year - 1, substr(year, 3, 4), sep = "-") # 添加Season列并调整顺序 raw_data <- cbind(Season = season_label, raw_data) # 把Season列移到Pos前面 col_pos <- which(names(raw_data) == "Pos") col_order <- c(1, col_pos:(ncol(raw_data)-1), 2:(col_pos-1)) raw_data <- raw_data[, col_order] return(raw_data) }
内容的提问来源于stack exchange,提问作者Anne Soled
相关产品推荐
相关产品推荐

