我有一个R数据框,类似于下面的数据框,其中包含每个用户以及他们活动的天数列表。
User date_active
1 2018-08-27
1 2018-08-28
1 2018-08-29
1 2018-08-31
1 2018-09-01
2 2018-07-05
2 2018-07-06
2 2018-07-07
2 2018-07-08
2 2018-07-10
2 2018-07-11
2 2018-07-12
2 2018-07-20
我想对所有日期进行计数,直到出现间隔,然后重新开始计数。对于上述数据,我的预期输出将类似于下表。
User date_active
1 3
1 2
2 4
2 3
2 1
我最初的猜测是使用rank
函数或difftime
,但不确定如何获得结果。非常感激任何的帮助!
答案 0 :(得分:3)
使用dplyr
,我们可以group_by
User
以及天数不等于1的天数。然后计算每个组中的行数。
library(dplyr)
df %>%
group_by(User, days = c(0, cumsum(diff(date_active) != 1))) %>%
summarise(date_active = n()) %>%
select(-days)
# User date_active
# <int> <int>
#1 1 3
#2 1 2
#3 2 4
#4 2 3
#5 2 1
这是假设您的date_active
属于Date
类,或者首先将其转换为Date
,
df$date_active <- as.Date(df$date_active)
创建分组变量是这里的关键。参见
c(0, cumsum(diff(df$date_active) != 1))
# [1] 0 0 0 1 1 2 2 2 2 3 3 3 4