首页 文章

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

提问于
浏览
1

我试图在点击流数据中指定会话 . 我根据months和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()

我一直在努力解决这个问题,所以任何帮助都会非常感激 .

谢谢!

1 回答

  • 1

    我们可以在'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
    

相关问题