R-创建一个具有连续数字的列,并使用mutate基于其他列重置

R-创建一个具有连续数字的列,并使用mutate基于其他列重置,r,if-statement,multiple-columns,reset,mutate,R,If Statement,Multiple Columns,Reset,Mutate,我试图使用mutate在我的df中创建一个新变量game_plus,它计算另一列游戏中事件发生后的天数,并在每次事件发生时重置。例如,我的df中的变量游戏是二进制的,可以进行游戏或训练。我正在考虑使用嵌套的ifelse语句生成以下输出: 我还想对一个列game_减号做一个相反的解释,它基本上计算一个事件之前的天数,如下所示 game game_plus game_minus Game 0 0 Training

我试图使用mutate在我的df中创建一个新变量game_plus,它计算另一列游戏中事件发生后的天数,并在每次事件发生时重置。例如,我的df中的变量游戏是二进制的,可以进行游戏或训练。我正在考虑使用嵌套的ifelse语句生成以下输出:

我还想对一个列game_减号做一个相反的解释,它基本上计算一个事件之前的天数,如下所示

game         game_plus      game_minus
Game             0              0
Training         1              3
Training         2              2
Training         3              1
Game             0              0
Training         1              2
Training         2              1 
Game             0              0
Training         1              4
Training         2              3
Training         3              2
Training         4              1
有人能帮忙吗?我知道我可以使用ifelsegame==Game,0,但是我很难弄清楚如何在ifelse语句中加入-previor或after-event-event-event元素。任何帮助都将不胜感激

library(tibble)
library(dplyr)

game_tbl <- 
tibble(game = c("Game",rep("Training", 3), "Game",rep("Training", 2),"Game",rep("Training", 4)))


game_tbl  %>% 
  mutate(period = cumsum(game == "Game")) %>% ## which rows belong to one game period 
  group_by(period, game) %>% 
  mutate(game_plus = case_when(game == "Game" ~ 0L , TRUE ~ row_number())) %>%
  group_by(period) %>%  
  mutate(units = n() ) %>% ## how many rows per  game period
  mutate(game_minus =  case_when(game == "Game" ~ 0L, TRUE ~  units - row_number() + 1L )) %>%
  ungroup() %>%
  select(game, game_plus, game_minus)
基本上,您需要使用group_by和row_number。 row_number添加每行的编号。与group_组合使用时,它可以遍历每个组的行。我添加了helper变量period来标识从游戏到最后一次训练属于一个游戏周期的所有行。因此,row_number将对game==game和game==Training的每个游戏期间的行进行计数。我还添加了helper可变单位来计算每个游戏期间的行数。

这里有一个使用数据的解决方案。表这里的要点是使用n_游戏将数据分解为多个部分。然后data.table有一种内置的方法,基本上使用.I获取行号,因此如果我们将数据分解到每个部分,我们可以将行号取反,以获得倒计时。剩下的最后一件事是为每个比赛日指定一个值0,而不是下一场比赛之前的天数

图书馆数据表 dt=data.tablegame=cGame,repTraining,3,Game,repTraining,2,Game,repTraining,4 为一天是否有游戏创建一个指示器 dt[,game_ind:=ifelsegame=='game',1,0] 使用指标,通过计算游戏的累计总和,将数据分组 dt[,n_game:=cumsumgame_ind] .SD[,.I]获取每组n_游戏的行号,rev将其设置为 倒计时而不是倒计时 dt[,game_减:=revunlist.SD[,.I],by=n_games] 将游戏天数设置为0 dt[game='game',game_减号:=0] dt >game game ind n_game game负 >第1场:第10场 >2:培训0 1 3 >3:培训0 1 2 >4:培训0 1 1 >第5场:第12场0 >6:培训0 2 >7:培训0 2 1 >8:第1场30 >9:培训0 3 4 >10:培训0 3 3 >11:培训0 3 2 >12:培训0 3 1 如果你想清理的话 dt[,c'game_ind',n_games':=NULL] 海德特 >博弈负 >1:第0场 >2:培训3 >3:培训2 >4:培训1 >第5场:第0场 >6:培训2 于2020年11月25日由v0.3.0创建

library(tibble)
library(dplyr)

game_tbl <- 
tibble(game = c("Game",rep("Training", 3), "Game",rep("Training", 2),"Game",rep("Training", 4)))


game_tbl  %>% 
  mutate(period = cumsum(game == "Game")) %>% ## which rows belong to one game period 
  group_by(period, game) %>% 
  mutate(game_plus = case_when(game == "Game" ~ 0L , TRUE ~ row_number())) %>%
  group_by(period) %>%  
  mutate(units = n() ) %>% ## how many rows per  game period
  mutate(game_minus =  case_when(game == "Game" ~ 0L, TRUE ~  units - row_number() + 1L )) %>%
  ungroup() %>%
  select(game, game_plus, game_minus)