在 mutate() 中使用 lag 为创建的列向前滚动值

Using lag in mutate() for rolling values forward for the created column

我正在尝试在点击流数据中指定会话。我根据月份和 userId 对行进行分组,并尝试创建另一个变量会话,该会话查看 diff_days 列,如果大于 0.00209 则增加,否则保持先前的值。所以基本上我正在尝试创建会话变量并同时在其上使用滞后版本。一组中的第一行始终是 session = 1.

例如,此数据是 group_by 中的一组数据:

ID Month diff_days
2    0     NA
2    0     0.0002
2    0     0.001
2    0     0.01
2    0     0.00034
2    0     0.1
2    0     0.3
2    0     0.00005

我想像这样在每个组中创建会话变量:

ID Month diff_days session
2   0    NA        1
2   0    0.0002    1
2   0    0.001     1    
2   0    0.01      2
2   0    0.00034   2
2   0    0.1       3
2   0    0.3       4
2   0    0.00005   4

我正在使用但未给出正确答案的代码:

data <- data %>% group_by(ID, Month)
%>% mutate(session =  ifelse(row_number() == 1, 1 ,
ifelse(diff_days < 0.0209, lag(session) , lag(session) + 1))) %>% ungroup()

我已经为此苦苦挣扎了很长一段时间,所以非常感谢任何帮助。

谢谢!

我们可以在按'ID'、'Month'分组后的逻辑向量上使用cumsum。创建一个逻辑向量 diff_days[-1] >= 0.00209(删除第一个观察值 NA 并附加 TRUE 作为第一个。然后,获取累积和,以便对于每个 TRUE 值,它都会被添加1.

data %>% 
   group_by(ID, Month) %>%
   mutate(session = cumsum(c(TRUE, diff_days[-1] >= 0.00209)))
# A tibble: 8 x 4
# Groups:   ID, Month [1]
#     ID Month diff_days session
#  <int> <int>     <dbl>   <int>
#1     2     0  NA             1
#2     2     0   0.0002        1
#3     2     0   0.001         1
#4     2     0   0.01          2
#5     2     0   0.00034       2
#6     2     0   0.1           3
#7     2     0   0.3           4
#8     2     0   0.00005       4