R 如何使用列表?

R 如何使用列表?,r,R,我试图使用R中的列表作为计算篮球队获胜百分比的字典。基本上,对于每一场胜利,我想增加适当的字典数量,对于每一场比赛,我想增加适当的字典数量。不知何故,我得到的答案似乎是合理的,但却是错误的,我无法理解为什么程序在逻辑上没有给出预期的输出。如有任何建议或提示,将不胜感激。我使用的代码如下: games <- read.csv(game_pathname, header = FALSE) names(games) <- c("GameDate", "DateCount", "HomeI

我试图使用R中的列表作为计算篮球队获胜百分比的字典。基本上,对于每一场胜利,我想增加适当的字典数量,对于每一场比赛,我想增加适当的字典数量。不知何故,我得到的答案似乎是合理的,但却是错误的,我无法理解为什么程序在逻辑上没有给出预期的输出。如有任何建议或提示,将不胜感激。我使用的代码如下:

games <- read.csv(game_pathname, header = FALSE)

names(games) <- c("GameDate", "DateCount", "HomeID", "AwayID", "HomePts", "AwayPts",     "HomeAbbr", "AwayAbbre", "HomeName", "AwayName")

wins = list()
total = list()

for (team in unique(games$HomeName)) {
    wins[team] <- 0
    total[team] <- 0
}

for (i in 1:nrow(games)) {
    if (games$HomePts[i] > games$AwayPts[i]) {
        wins[games$HomeName[i]] <- wins[[games$HomeName[i]]] + 1
    } else {
        wins[games$AwayName[i]] <- wins[[games$AwayName[i]]] + 1
    }
    total[games$HomeName[i]] <- total[[games$HomeName[i]]] + 1
    total[games$AwayName[i]] <- total[[games$AwayName[i]]] + 1
}

for (team in unique(games$HomeName)) {
    print(paste(team, wins[[team]] / total[[team]]))
}
[1] "a 0"
[1] "b 0.5"
[1] "c 1"

> games
  HomeName HomePts AwayPts AwayName
1        a       1       3        c
2        b       2       1        a
3        c       3       2        b

> wins
$`a`
[1] 0

$b
[1] 1

$c
[1] 2

> total
$`a`
[1] 2

$b
[1] 2

$c
[1] 2

games正如我在代码中看到的,通过创建玩具示例,算法中没有问题。在下面的模拟中,我使用了三支球队,其中一支是完全松散的,另一支是收支平衡的,第三支是冠军

games <- data.frame(HomeName = c("a", "b", "c"),
                    HomePts = c(1, 2, 3),
                    AwayPts = c(3, 1, 2),
                    AwayName = c("c", "a", "b")                    )
wins = list()
total = list()

for (team in unique(games$HomeName)) {
  wins[team] <- 0
  total[team] <- 0
}

for (i in 1:nrow(games)) {
  if (games$HomePts[i] > games$AwayPts[i]) {
    wins[games$HomeName[i]] <- wins[[games$HomeName[i]]] + 1
  } else {
    wins[games$AwayName[i]] <- wins[[games$AwayName[i]]] + 1
  }
  total[games$HomeName[i]] <- total[[games$HomeName[i]]] + 1
  total[games$AwayName[i]] <- total[[games$AwayName[i]]] + 1
}

for (team in unique(games$HomeName)) {
  print(paste(team, wins[[team]] / total[[team]]))
}

games
wins
total
然而,使用
进行
并不是很“R风格”,直接使用列表索引被认为不是“comme il faut”:

例如,
dplyr
packag\\是软件包的一部分,您可以获得类似的结果。下面的代码是对游戏结果的比较,然后将其拆分为两个数据帧并按行合并。最后按队名分组,计算平均获胜率。请参阅下文:

library(dplyr)
df <- games %>% mutate(hwins = (HomePts > AwayPts), awins = !hwins)
df_home <- df %>% select(HomeName, hwins) %>% rename(name = HomeName, wins = hwins)
df_away <- df %>% select(AwayName, awins) %>% rename(name = AwayName, wins = awins)
df <- bind_rows(df_home, df_away) %>% group_by(name) %>% summarise(mean_wins = mean(wins))
df
库(dplyr)
df%变异(hwins=(HomePts>AwayPts),awins=!hwins)
df_home%select(HomeName,hwins)%%>%rename(name=HomeName,wins=hwins)
df_离开%select(AwayName,awins)%%>%rename(name=AwayName,wins=awins)
df%按(姓名)分组%>%总结(平均得分=平均得分)
df
输出:

# A tibble: 3 x 2
  name  mean_wins
  <fct>     <dbl>
1 a           0  
2 b           0.5
3 c           1  
#一个tible:3 x 2
名字意味着你赢了
1 a 0
2 b 0.5
3 c 1

有关创建可复制示例的信息,请参阅,这样我们就不必猜测csv文件中有什么内容…当您按照Joris的建议操作时,哈希表可能是解决问题的快速方法。请记住,在索引到列表中时,您必须使用两个方括号[[]]…我建议您查看
聚合
函数。