我有这个 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")
有什么想法吗?
我怀疑您正在寻找
的聪明(和矢量化)版本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")