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

如何在R语言的data.frame中添加获胜队伍列并显示具体获胜国家?

给足球比赛数据集添加获胜队伍列(高效处理大数据集)

我来帮你搞定这个问题!你现在的代码只是打印胜负状态,没把具体队伍关联到新列里,而且循环的写法既低效又容易出错,咱们一步步来修正和优化:

先说说你现有代码的几个问题:

  • 循环里用了length(results),这是取数据框的列数,不是行数!应该用nrow(results)来遍历每一行
  • 你只是打印了胜负状态,但没有把结果存储到新创建的winning_team列中
  • 用显式循环处理3万+行数据效率很低,R的优势是向量化操作,比循环快得多

方案1:基础R向量化解法(最简单高效)

用嵌套的ifelse直接对整列进行计算,不用循环,处理大数据集毫无压力:

# 直接添加winning_team列到数据框
results$winning_team <- ifelse(
  results$home_score > results$away_score,  # 第一个条件:主场得分更高
  results$home_team,                        # 满足条件时取主场队伍
  ifelse(
    results$home_score == results$away_score,  # 第二个条件:平局
    "Draw",                                    # 平局时标记为Draw
    results$away_team                          # 否则取客场队伍
  )
)

方案2:dplyr tidyverse风格(更清晰易读)

如果你习惯用tidyverse工具包,case_when可以让多条件分支更直观,代码可读性更强:

# 先加载dplyr(如果没安装先运行install.packages("dplyr"))
library(dplyr)

results <- results %>%
  mutate(winning_team = case_when(
    home_score > away_score ~ home_team,   # 主场赢
    home_score == away_score ~ "Draw",     # 平局
    TRUE ~ away_team                       # 客场赢(剩下的所有情况)
  ))

如果你一定要用循环(不推荐大数据集)

如果只是想理解循环的写法,这里修正后的循环代码:

# 先初始化一个空的字符列,长度等于数据行数
results$winning_team <- character(nrow(results))

# 遍历每一行
for (i in 1:nrow(results)) {
  if (results$home_score[i] > results$away_score[i]) {
    results$winning_team[i] <- results$home_team[i]
  } else if (results$home_score[i] == results$away_score[i]) {
    results$winning_team[i] <- "Draw"
  } else {
    results$winning_team[i] <- results$away_team[i]
  }
}

⚠️ 注意:这个方法处理3万+行数据会比向量化操作慢很多,所以优先推荐前两种方案!


验证结果

用你给的示例数据集测试,运行代码后查看results,winning_team列会显示:

  • 第一行(0-0):Draw
  • 第二行(4-2):England
  • 第三行(2-1):Scotland
  • ...以此类推,完全符合预期

内容的提问来源于stack exchange,提问作者datadude_ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:00:47