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

为R语言read_prem_league函数添加Season列并解决报错问题

解决方法

报错原因

你直接用read_prem_league$Season <- year报错,是因为read_prem_league是函数(closure类型),不是数据框/tibble,函数不能用$来子集赋值——你应该操作函数内部生成的tibble数据,而不是函数本身。

正确实现步骤

  1. 生成正确的赛季格式字符串:输入的year是赛季结束年份,比如2021对应2020-21赛季,所以用paste(year-1, substr(year,3,4), sep="-")生成格式字符串。
  2. 在函数内部处理数据:先获取原始的英超数据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:24:21