使用mutate()中的滞后向前滚动创建的列的值

时间:2018-10-15 16:59:00

标签: r dplyr lag mutate clickstream

我正在尝试在点击流数据中指定会话。我根据月和userId对行进行分组,并尝试创建另一个变量会话,该会话在diff_days列中查找,如果> 0.00209,则增加on,否则保持为先前值。因此,基本上我想创建会话变量并同时使用滞后版本。组中的第一行始终为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()

我已经为此苦苦挣扎了很长时间了,因此任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

在按“ ID”,“月”分组后,我们可以在逻辑向量上使用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