R 如何使用列表?
我试图使用R中的列表作为计算篮球队获胜百分比的字典。基本上,对于每一场胜利,我想增加适当的字典数量,对于每一场比赛,我想增加适当的字典数量。不知何故,我得到的答案似乎是合理的,但却是错误的,我无法理解为什么程序在逻辑上没有给出预期的输出。如有任何建议或提示,将不胜感激。我使用的代码如下:R 如何使用列表?,r,R,我试图使用R中的列表作为计算篮球队获胜百分比的字典。基本上,对于每一场胜利,我想增加适当的字典数量,对于每一场比赛,我想增加适当的字典数量。不知何故,我得到的答案似乎是合理的,但却是错误的,我无法理解为什么程序在逻辑上没有给出预期的输出。如有任何建议或提示,将不胜感激。我使用的代码如下: games <- read.csv(game_pathname, header = FALSE) names(games) <- c("GameDate", "DateCount", "HomeI
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的建议操作时,哈希表可能是解决问题的快速方法。请记住,在索引到列表中时,您必须使用两个方括号[[]]…我建议您查看聚合
函数。