【问题标题】:Grouped looping in RR中的分组循环
【发布时间】:2021-04-22 13:00:33
【问题描述】:

我正在寻找循环数据和更新某个变量的最佳方法,同时对另一个变量进行分组。我觉得我已经很接近了,但是我还没有足够的练习 R 中的循环来完全做到这一点。如果有人可以帮助我,将不胜感激! 这是我第一次在这里提出问题:我希望代码会有所帮助!

studentID <- c(1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4)
lag_time <- c(0,3.8,4.6,2.6,720,3.4,200,780,860,3.5,2.5,3.3,6.68,945,7.5,2.3,1.2,3.2,83456.093,5.3,4.2,56540)
session <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)

df <- data.frame(studentID, lag_time, session)

好的,所以我想做的是:我有一个由 studentID 排列的网站日志数据的数据框,我想为每个学生计算他们当前所在的会话。我已经计算了 lag_time,基本上是两者之间的时间表示会话的行。如果 lag_time >= 600,那么我想更新变量 'session' + 1,每个 studentID。最后应该是这样的:

studentID   lag_time  session
1           0         1
1           3.8       1
1           4.6       1
1           2.6       1
1           720       2
2           3.4       1
2           200       1
2           780       2
2           860       3
3           3.5       1
3           2.5       1
3           3.3       1
3           6.68      1
3           945       2
3           7.5       2
3           2.3       2
3           1.2       2
4           3.2       1
4           83456.093 2
4           5.3       2
4           4.2       2
4           56540     3

希望我解释正确,期待看到您的建议!

【问题讨论】:

    标签: r loops for-loop grouping


    【解决方案1】:

    您可以在cumsum 的帮助下完成此操作。

    使用dplyr

    library(dplyr)
    
    df %>%
      group_by(studentID) %>%
      mutate(session =  session + cumsum(lag_time >= 600)) %>%
      ungroup() 
    

    在基础 R 中:

    transform(df, session = session + ave(lag_time >= 600, studentID, FUN = cumsum))
    
    #   studentID lag_time session
    #1          1     0.00       1
    #2          1     3.80       1
    #3          1     4.60       1
    #4          1     2.60       1
    #5          1   720.00       2
    #6          2     3.40       1
    #7          2   200.00       1
    #8          2   780.00       2
    #9          2   860.00       3
    #10         3     3.50       1
    #11         3     2.50       1
    #12         3     3.30       1
    #13         3     6.68       1
    #14         3   945.00       2
    #15         3     7.50       2
    #16         3     2.30       2
    #17         3     1.20       2
    #18         4     3.20       1
    #19         4 83456.09       2
    #20         4     5.30       2
    #21         4     4.20       2
    #22         4 56540.00       3
    

    【讨论】:

    • 您好 Ronak,感谢您清晰快速的回答!我采用了你的方法,效果很好! - 黛米
    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2014-07-08
    • 2018-05-02
    • 2021-08-27
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多