我有一个数据集,其中我有不同的provider
参加过一次site
。
我想创建列以显示start
和stop
的日期。
这是一个示例数据集:
x <- tibble(
"site" = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
"provider" = c("A", "B", "C", "A", "A", "C", "C", "A", "C", "A"),
"date" = seq(from = as.Date("2019-01-01"), to = as.Date("2019-01-10"), by = 'day'),
)
我一直无法创建一些代码来充分捕捉提供者可能多次出现的事实。到目前为止,我得到的最好成绩是:
x %>%
group_by(site, provider) %>%
mutate("start" = min(date),
"end" = max(date))
哪个创建的:
# A tibble: 10 x 5
# Groups: site, provider [5]
site provider date start end
<dbl> <chr> <date> <date> <date>
1 1 A 2019-01-01 2019-01-01 2019-01-05
2 1 B 2019-01-02 2019-01-02 2019-01-02
3 1 C 2019-01-03 2019-01-03 2019-01-03
4 1 A 2019-01-04 2019-01-01 2019-01-05
5 1 A 2019-01-05 2019-01-01 2019-01-05
6 2 C 2019-01-06 2019-01-06 2019-01-09
7 2 C 2019-01-07 2019-01-06 2019-01-09
8 2 A 2019-01-08 2019-01-08 2019-01-10
9 2 C 2019-01-09 2019-01-06 2019-01-09
10 2 A 2019-01-10 2019-01-08 2019-01-10
但是,此操作provider
仅对单个site
处理一次。
这就是我想要的最终数据集的样子:
# A tibble: 10 x 5
# Groups: site, provider [5]
site provider date start end
<dbl> <chr> <date> <date> <date>
1 1 A 2019-01-01 2019-01-01 2019-01-01 # A stops at 2019-01-01
2 1 B 2019-01-02 2019-01-02 2019-01-02
3 1 C 2019-01-03 2019-01-03 2019-01-03
4 1 A 2019-01-04 2019-01-04 2019-01-05 # A restarts from 2019-01-04
5 1 A 2019-01-05 2019-01-04 2019-01-05
6 2 C 2019-01-06 2019-01-06 2019-01-07
7 2 C 2019-01-07 2019-01-06 2019-01-07 # C stops at 2019-01-07
8 2 A 2019-01-08 2019-01-08 2019-01-08 # A stops at 2019-01-08
9 2 C 2019-01-09 2019-01-09 2019-01-09 # C restarts at 2019-01-09
10 2 A 2019-01-10 2019-01-10 2019-01-10 # A restarts at 2019-01-10
答案 0 :(得分:1)
使用data.table::rleid
创建另一个组
library(dplyr)
x %>%
group_by(site, provider, group = data.table::rleid(provider)) %>%
mutate(start = min(date), end = max(date)) %>%
ungroup() %>%
select(-group)
# A tibble: 10 x 5
# site provider date start end
# <dbl> <chr> <date> <date> <date>
# 1 1 A 2019-01-01 2019-01-01 2019-01-01
# 2 1 B 2019-01-02 2019-01-02 2019-01-02
# 3 1 C 2019-01-03 2019-01-03 2019-01-03
# 4 1 A 2019-01-04 2019-01-04 2019-01-05
# 5 1 A 2019-01-05 2019-01-04 2019-01-05
# 6 2 C 2019-01-06 2019-01-06 2019-01-07
# 7 2 C 2019-01-07 2019-01-06 2019-01-07
# 8 2 A 2019-01-08 2019-01-08 2019-01-08
# 9 2 C 2019-01-09 2019-01-09 2019-01-09
#10 2 A 2019-01-10 2019-01-10 2019-01-10
答案 1 :(得分:1)
仅使用min
的选项,其中通过比较'provider'的相邻元素来创建'grp',取逻辑向量的累加和并找到max
和library(dplyr)
x %>%
group_by(site, provider,
grp = cumsum(provider != lag(provider, default = first(provider)))) %>%
mutate(start = min(date), end = max(date)) %>%
ungroup %>%
select(-grp)
# A tibble: 10 x 5
# site provider date start end
# <dbl> <chr> <date> <date> <date>
# 1 1 A 2019-01-01 2019-01-01 2019-01-01
# 2 1 B 2019-01-02 2019-01-02 2019-01-02
3 3 1 C 2019-01-03 2019-01-03 2019-01-03
# 4 1 A 2019-01-04 2019-01-04 2019-01-05
# 5 1 A 2019-01-05 2019-01-04 2019-01-05
# 6 2 C 2019-01-06 2019-01-06 2019-01-07
# 7 2 C 2019-01-07 2019-01-06 2019-01-07
# 8 2 A 2019-01-08 2019-01-08 2019-01-08
# 9 2 C 2019-01-09 2019-01-09 2019-01-09
#10 2 A 2019-01-10 2019-01-10 2019-01-10
“网站”,“提供商”和“全球定位系统”分组后的“日期”的显示
"@progress/kendo-angular-grid": "^3.12.1"