为组中的单个变量分配多个开始和结束日期

时间:2019-06-05 10:19:01

标签: r dplyr

我有一个数据集,其中我有不同的provider参加过一次site

我想创建列以显示startstop的日期。

这是一个示例数据集:

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

2 个答案:

答案 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',取逻辑向量的累加和并找到maxlibrary(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"