R-创建一个具有连续数字的列,并使用mutate基于其他列重置
我试图使用mutate在我的df中创建一个新变量game_plus,它计算另一列游戏中事件发生后的天数,并在每次事件发生时重置。例如,我的df中的变量游戏是二进制的,可以进行游戏或训练。我正在考虑使用嵌套的ifelse语句生成以下输出: 我还想对一个列game_减号做一个相反的解释,它基本上计算一个事件之前的天数,如下所示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
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)