在 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
好的,我们有一些非常标准的数据,看起来像这样,带有日期和用户 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()
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