我是一个新手R用户,正在使用循环更新我的数据框架中事件参与者的评级。当我从更大的数据框架中过滤出来时,我为一个独特的参与者创建了循环。如果我添加更多的参与者并将groupby(Participant)
包含到循环中,或者我查找的其他建议方法,则评级将按行更新,而不是按单个参与者更新。
我的数据帧由大约120000行、大约15000个参与者组成,我读过的循环可能很慢。我也看过应用程序家族,但不知道这将如何处理我的数据,但我非常乐意得到更正并节省时间!
评级在一定程度上基于ELO方法,但不是成对比较,我已经调整了公式以满足我的要求。从纸面上看,它是有效的,所以希望能在R.中复制它
下面我们有我正在使用的数据帧的等价物。使用New_rating
,我将使用循环为每个参与者的每个后续事件生成评级。下面的循环代码是我在只有1个唯一参与者的情况下使用的,它运行得很好。如果这可以编辑为工作,快乐的日子,但任何解决方案都将不胜感激!
df <- data.frame(Participant = c("A", "B", "A", "C", "B", "A", "C"))
df$Event <- c(1, 1, 2, 1, 2, 3, 2)
df$Initial_rating <- 1500
df$Result <- c(-4.507,25.488,18.113,-11.333,-5.083,0.507,8.667)
df$New_rating <- c(1495.493,1525.488,0,1488.667,0,0,0)
n <- nrow(df)
for (i in 2:n) {
df$New_rating[i] <- (df$New_rating[i-1] + df$Result[i])
}
如果我们想在OP的for
循环上构建,在"Participant"列的unique
值上循环,根据循环值("tmp"(对数据进行子集设置,然后用"tmp"数据进行内部for
,并在退出内部循环后更新原始数据集
df$New_rating2 <- df$New_rating
un1 <- unique(df$Participant)
for(un in un1) {
i1 <- df$Participant == un
tmp <- df[i1,]
n <- nrow(tmp)
for (i in 2:n) {
tmp$New_rating2[i] <- (tmp$New_rating2[i-1] + tmp$Result[i])
}
df[i1, ] <- tmp
}
注:有更好的方法可以通过运算或split
在一组中实现这一点,但由于显示的计算是伪的,我们坚持使用OP的for
循环
按"参与者"分组后,也可以使用accumulate
library(dplyr)
library(purrr)
df %>%
group_by(Participant) %>%
mutate(New_rating3 = accumulate2(New_rating, Result[-1],
~ ..1 + ..3) %>% flatten_dbl) %>%
ungroup
# A tibble: 7 × 7
Participant Event Initial_rating Result New_rating New_rating2 New_rating3
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 1 1500 -4.51 1495. 1495. 1495.
2 B 1 1500 25.5 1525. 1525. 1525.
3 A 2 1500 18.1 0 1514. 1514.
4 C 1 1500 -11.3 1489. 1489. 1489.
5 B 2 1500 -5.08 0 1520. 1520.
6 A 3 1500 0.507 0 1514. 1514.
7 C 2 1500 8.67 0 1497. 1497.