dplyr 滞后,滞后数因观察而异

dplyr lag, with number of lags varying by observation

我有 following form. 的数据(另见下文)

第一个变量 V1 描述了观察的类型 - 那些标记为 H 的变量给出了以下所有值的信息,直到另一个 H 观察。第二个变量,对于所有其他观察值,表示上面有多少观察值是描述该变量的 H。

我想计算一个变量,它是第三个变量 V3 的滞后值,其中滞后数等于变量 V2 的值。有没有办法在 dplyr 中使用 lag() 函数,我可以在其中为其提供 n 个随数据集行而变化的滞后数?还有其他方法可以计算随行变化的滞后吗?理想情况下,我想使用 dplyr 的方法,因为我将其应用于 sparklyr 有用的大数据。

编辑: 我数据的前 25 个观察值的 dput 输出:

structure(list(V1 = c("H", "L", "S", "S", "S", "S", "S", "S", 
"S", "S", "H", "L", "S", "S", "S", "S", "S", "S", "S", "S", "H", 
"L", "S", "S", "S"), V2 = c(723L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 723L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 723L, 1L, 2L, 
3L, 4L), V3 = c("O2:CH\A20\7250.0", "1574721653.7385", "1574721662.9515", 
"1574729100.1103", "1574729880.0359", "1574730000.0388", "1574757000.0533", 
"1574757240.0648", "1574757300.0335", "1574757360.039", "O2:CH\A20\7300.0", 
"1574721653.7385", "1574721662.9515", "1574729100.1103", "1574729880.0359", 
"1574730000.0388", "1574757000.0533", "1574757240.0648", "1574757300.0335", 
"1574757360.039", "O2:CH\A20\7350.0", "1574721653.7385", "1574721662.9515", 
"1574729100.1103", "1574729880.0359"), V4 = c("USD", "1", "0", 
"2", "3", "5", "9", "3", "12", "13", "USD", "1", "0", "2", "3", 
"5", "9", "3", "12", "13", "USD", "1", "0", "2", "3"), V5 = c("6", 
"", "", "", "", "", "", "", "", "", "6", "", "", "", "", "", 
"", "", "", "", "6", "", "", "", "")), row.names = c(NA, 25L), class = "data.frame")

lag 只能接受一个标量值,但这里有一个我们可以使用的小技巧:

library(dplyr)

df %>%
  mutate(inds = row_number() - lag, 
         c = a[replace(inds, inds < 1, NA)])

#    a lag inds  c
#1   1   3   -2 NA
#2   2   3   -1 NA
#3   3   3    0 NA
#4   4   2    2  2
#5   5   3    2  2
#6   6   2    4  4
#7   7   2    5  5
#8   8   2    6  6
#9   9   3    6  6
#10 10   1    9  9

c 是我们正在查看的最终输出。基本上,我们用滞后值减去当前行号以获得用于子集 a 值的索引。

数据

set.seed(123)
df <- data.frame(a = 1:10, lag = sample(3, 10, replace = TRUE))
df
#    a lag
#1   1   3
#2   2   3
#3   3   3
#4   4   2
#5   5   3
#6   6   2
#7   7   2
#8   8   2
#9   9   3
#10 10   1