根据不同列中的名称更改重新启动滞后

Restarting Lag based on Change in Name in Different Column

我正在尝试将变量的滞后插入到 R 数据框中的单独列中。但是,每次不同列中的名称更改时,我都希望滞后为 'restart'。

数据示例如下:

        Player  Crosses
   Robbie Brady       11
   Robbie Brady        9
   Robbie Brady       13
   Robbie Brady       15
   Robbie Brady       20
Robert Snodgrass       5

我想要'Crosses'的延迟,我正在使用:

lag(data$Crosses, 1)

来帮助做到这一点。但是当玩家名称更改时,我希望延迟重新开始,否则延迟会延续到与他们无关的观察中。所以只是做

data$lag1 <- lag(data$Crosses, 1)

不行

我试过使用:

tapply(data$Crosses, data$Player, lag, 1) 

但这会生成一个数组,我无法将其作为新列输入到我的数据框中。

有谁知道我可以将滞后输入到我的数据框中,同时在另一列中的值更改时重新启动滞后的解决方案?

我们可以按 'Player' 分组,然后在十字架上进行 lag。这可以用 data.table 来完成。我们将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'Player' 分组,我们创建一个新列 ('lag1') 作为 Crosses 的滞后。在data.table的开发版本中,shift默认给出lag

 library(data.table)#v1.9.5+
 setDT(df1)[, lag1:=shift(Crosses) , by = Player]

或者使用 dplyr,我们按 'Player' 分组并使用 mutate

创建一个新列
 library(df1)
 df1 %>%
     group_by(Player) %>%
     mutate(lag1 = lag(Crosses))

你可以使用 ave

data$lag1 <- ave(data$Crosses, data$Player, FUN=function(x) lag(x, 1))