根据连胜定义连败(复杂的变异逻辑帮助)

问题描述 投票:0回答:1

我有这个 df,其中有连胜。例如:

 dput(stack_df)
structure(list(player = c("id_p1", "id_p2", "id_p1", "id_p1", 
"id_p1", "id_p1", "id_p2", "id_p2", "id_p1", "id_p2"), win_streak = c(1L, 
1L, 1L, 2L, 3L, 4L, 1L, 2L, 1L, 1L)), row.names = c(NA, -10L), class = "data.frame")

玩家进行比赛,每行包含一轮获胜的玩家。连胜将给定玩家的连续获胜次数相加。我现在想要获取每个重复当前获胜者 win_streak 中所有行的对手最近连胜值的最大连胜值的玩家的连败记录。

例如当前的df会变成:

> dput(stack_df)
structure(list(player = c("id_p1", "id_p2", "id_p1", "id_p1", 
"id_p1", "id_p1", "id_p2", "id_p2", "id_p1", "id_p2"), win_streak = c(1L, 
1L, 1L, 2L, 3L, 4L, 1L, 2L, 1L, 1L), loss_streak = c(NA, 1, 1, 
1, 1, 1, 4, 4, 2, 1)), row.names = c(NA, -10L), class = "data.frame")

有什么想法吗?

r
1个回答
0
投票

我怀疑您正在寻找

的聪明(和矢量化)版本
In$loss_streak2 = NA
for(i in seq(nrow(In))[-1L]) {
  a = In$player[i]; b = In$player[i-1L]
  In$loss_streak2[i] = 
    if(a!=b) In$win_streak[max(which(In$player[seq(i)]!=a))] else In$loss_streak2[i-1L]
}

给予

   player win_streak loss_streak loss_streak2
1   id_p1          1          NA           NA
2   id_p2          1           1            1
3   id_p1          1           1            1
4   id_p1          2           1            1
5   id_p1          3           1            1
6   id_p1          4           1            1
7   id_p2          1           4            4
8   id_p2          2           4            4
9   id_p1          1           2            2
10  id_p2          1           1            1

(在德国现在已经太晚了,我明天就回来。)


输入

In = structure(list(player = c("id_p1", "id_p2", "id_p1", "id_p1", "id_p1", 
                               "id_p1", "id_p2", "id_p2", "id_p1", "id_p2"), 
                    win_streak = c(1L, 1L, 1L, 2L, 3L, 4L, 1L, 2L, 1L, 1L), 
                    loss_streak = c(NA, 1, 1, 1, 1, 1, 4, 4, 2, 1)), 
               row.names = c(NA, -10L), class = "data.frame")
© www.soinside.com 2019 - 2024. All rights reserved.