如何最好地将groupby合并到R中的循环中



我是一个新手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.

最新更新