在 r 中随时间获取 运行 组计数

Get a running count of group over time in r

好的,我们有一些非常标准的数据,看起来像这样,带有日期和用户 ID 列,但 ID 可以在一天内出现多次:

id               Date
as7fyaisdf       2017-11-08
p98ashdfp9       2017-11-08
p98ashdfp9       2017-11-08
p98ashdfp9       2017-11-08
2984oinrv7       2017-11-08
as7fyaisdf       2017-11-09
p98ashdfp9       2017-11-09
2984oinrv7       2017-11-09
9asjenorin       2017-11-09

我想获得一个 运行 计数,显示给定 ID 在一段时间内出现的累计次数。但我只希望它计算一天一次。所以在这种情况下它看起来像这样:

id               Date           running_count
as7fyaisdf       2017-11-08     1
p98ashdfp9       2017-11-08     1
p98ashdfp9       2017-11-08     1
p98ashdfp9       2017-11-08     1
2984oinrv7       2017-11-08     1
as7fyaisdf       2017-11-09     2
p98ashdfp9       2017-11-09     2
2984oinrv7       2017-11-09     2
9asjenorin       2017-11-09     1

我感觉这可能涉及到rle()函数或者data.table的rleid(),但是一直没能破解。如果可能的话,我想在 tidyverse 中执行此操作,但对 R 宇宙中的其他选项持开放态度。希望保留此信息,不胜感激。

您可以按 id 分组并得到 row_number:

library(tidyverse) 
df %>%
   left_join(distinct(.) %>%
   group_by(id) %>%
   mutate(running_count = row_number()))

          id       Date running_count
1 as7fyaisdf 2017-11-08             1
2 p98ashdfp9 2017-11-08             1
3 p98ashdfp9 2017-11-08             1
4 p98ashdfp9 2017-11-08             1
5 2984oinrv7 2017-11-08             1
6 as7fyaisdf 2017-11-09             2
7 p98ashdfp9 2017-11-09             2
8 2984oinrv7 2017-11-09             2
9 9asjenorin 2017-11-09             1

由于您询问了 data.table

使用rleid

dt[order(id,Date),running_count:=rleid(Date),by=id][]

或加入 unique,就像使用 distinct()

的 tidyverse 解决方案
dt[unique(dt)[,running_count:=1:.N, by=.(id)], on=.(id, Date)]

这两个选项都会导致此输出:

           id       Date running_count
1: as7fyaisdf 2017-11-08             1
2: p98ashdfp9 2017-11-08             1
3: p98ashdfp9 2017-11-08             1
4: p98ashdfp9 2017-11-08             1
5: 2984oinrv7 2017-11-08             1
6: as7fyaisdf 2017-11-09             2
7: p98ashdfp9 2017-11-09             2
8: 2984oinrv7 2017-11-09             2
9: 9asjenorin 2017-11-09             1