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

好的,所以我们有一些非常标准的数据,看起来像这样,带有 date 和用户 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 宇宙中的其他选项持开放态度。希望在任何帮助中保留此信息。

回答1

您可以按 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

回答2

由于您询问了 data.table

使用 rleid

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

或加入 unique,如 tidyverse 解决方案,它使用 distinct()

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

相似文章

最新文章