r - 使用 R 按期间和 id 对日期进行分组
问题描述
我有一个按 ID 列出的事件列表,并希望在两周内对它们进行分组。当每个 ID 发生第一个事件时,两周应该开始。分组的事件数据应如下所示,
ID Date Group
<dbl> <date> <dbl>
1 2018-01-01 1
1 2018-01-02 1
1 2018-01-02 1
1 2018-02-01 2
1 2018-03-01 3
2 2018-01-01 4
2 2018-04-01 5
dat = structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L), Date = structure(c(17532,
17533, 17533, 17563, 17591, 17532, 17622), class = "Date"), Group = c(1L,
1L, 1L, 2L, 3L, 4L, 5L)), .Names = c("ID", "Date", "Group"), row.names = c(NA,
-7L), class = c("tbl_df", "tbl", "data.frame"))
我最初是在考虑通过 ID 滞后并过滤两周内发生的事件,但可能有很多事件对应于一个两周内。
解决方案
您可以使用cut
andseq
舍入到最接近的两周截止值,然后group_indices
制作一个递增的索引:
dat %>%
group_by(ID) %>%
mutate(g = cut(Date, seq(first(Date), max(Date) + 14, by="2 weeks")) %>% as.character) %>%
ungroup %>%
mutate(g = group_indices(., ID, g))
# A tibble: 7 x 4
ID Date Group g
<int> <date> <int> <int>
1 1 2018-01-01 1 1
2 1 2018-01-02 1 1
3 1 2018-01-02 1 1
4 1 2018-02-01 2 2
5 1 2018-03-01 3 3
6 2 2018-01-01 4 4
7 2 2018-04-01 5 5
推荐阅读
- git - 即使我正在使用子模块,也会警告嵌入 Git 存储库
- javascript - jQuery date-picker javascript语法问题
- angular - Angular 是映射对象、类或服务或静态函数的最佳解决方案
- java - 为 Tomcat 配置 SOAP - 请求总是被拒绝 (403)
- cluster-computing - Mapbox GL JS - 移除 mbtile 上的集群效应
- mysql - MySQL ORDER BY CASE 优化
- r - 在包含单个双引号的列上使用 data.table::fread
- c++ - 调用 `curl_easy_send` 和 `curl_easy_recv` 时应用了哪些 `libcurl` 选项?
- excel - 如何将Bloomberg函数BDP“植入”到单元格VBA中
- apache-spark - Spark 2.x - parquet 文件的 gzip 与 snappy 压缩