在R中使用for循环更新向量的问题

时间:2019-09-05 11:47:00

标签: r

我正在尝试运行用于计算上赛季英超联赛中每支球队得分的主场进球数的代码。由于某些原因,当我运行以下for循环时,矢量OVHG的值不会改变。

install.packages("Hash")
library(hash)

fantasyData <- read.csv("PremierData.csv")
attach(fantasyData)
head(fantasyData)

teams = c("Arsenal", "Aston Villa", "Bournemouth", "Brighton", "Burnley", "Chelsea", "Crystal Palace", "Everton", "Leicester", "Liverpool",
"Man City", "Man United", "Newcastle", "Norwich", "Sheffield Wed", "Southampton", "Tottenham", "Watford", "West Ham", "Wolves")

values = seq(1, 20)
teamDict <- hash(teams, values)

OVHG = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0 ,0, 0, 0, 0,0, 0, 0, 0)

for (team in teams) {
  for (i in 1:length(HomeTeam)) {
    if (HomeTeam[i] == team) {
      OVHG[teamDict$team] <- OVHG[teamDict$team] + FTHG[i]
    }
  }
}

没有错误消息,但是OVHG的值保持不变。

  

OVHG    [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

1 个答案:

答案 0 :(得分:0)

您对i使用向量运算,然后使用逻辑向量(i)进行索引:

# install.packages("hash")
library("hash")

### data from https://datahub.io/sports-data/english-premier-league
fantasyData <- read.csv("https://datahub.io/sports-data/english-premier-league/r/season-1819.csv", stringsAsFactors = FALSE)

Teams <- data.frame(teams = sort(unique(fantasyData$HomeTeam)), OVHG = 0, stringsAsFactors = FALSE)   

values = seq(1, 20)
teamDict <- hash(Teams$teams, values)

for (team in Teams$teams) {
  i <- (fantasyData$HomeTeam == team)
  Teams$OVHG[teamDict[[team]]] <- Teams$OVHG[teamDict[[team]]] + sum(fantasyData$FTHG[i])
}

Teams

使用attach()通常不是一个好主意;这是一个附加问题的简短示例:

B <- BOD;
attach(B);
demand[3] <- 999;
demand;
detach(B);
B

也阅读fortunes::fortune(379)


没有hash,您可以执行以下操作:

fantasyData <- read.csv("https://datahub.io/sports-data/english-premier-league/r/season-1819.csv", stringsAsFactors = FALSE)

Teams <- data.frame(teams = sort(unique(fantasyData$HomeTeam)), stringsAsFactors = FALSE)

ovhg <- function(team) sum(fantasyData$FTHG[fantasyData$HomeTeam == team])
Teams$OVHG <- sapply(Teams$teams, ovhg)

Teams