Dplyr:每行返回值min,max的流量

时间:2018-04-22 22:01:50

标签: r dplyr

我正在尝试使用Dplyr来组织以下数据:

id  type    date_collected
1   A       2018-01-01
2   A       2018-01-01
3   B       2018-01-01
1   A       2018-01-02
2   B       2018-01-02
3   B       2018-01-02
1   B       2018-01-03
2   B       2018-01-03
3   A       2018-01-03
1   B       2018-01-04
2   B       2018-01-04
3   A       2018-01-04
1   A       2018-01-05
2   B       2018-01-05
3   A       2018-01-05

数据框:

id  type    min_date    max_date
1   A       2018-01-01  2018-01-02
1   B       2018-01-03  2018-01-04
1   A       2018-01-05  2018-01-05
2   A       2018-01-01  2018-01-01
2   B       2018-01-02  2018-01-05
3   B       2018-01-01  2018-01-02
3   A       2018-01-03  2018-01-05

我正在尝试获得以下输出:

df %>% group_by(id, type) %>% summarise(min_date = min(date_collected), max_date = max(date_collected), n = n())

这是我尝试使用的Dplyr代码,但没有成功:

{{1}}

我错过了什么?

1 个答案:

答案 0 :(得分:1)

你非常接近解决方案。在应用date_collected之前,您需要将Date列转换为min/max类型。使用lubridatedplyr的一个选项是:

library(lubridate)
library(dplyr)


df %>% mutate(date_collected = ymd(date_collected), type = as.character(type)) %>%
  arrange(id) %>%
  group_by(id, type, chng_over = cumsum(type != lag(type, default = " "))) %>%
  summarise(min_date = min(date_collected), max_date = max(date_collected)) %>%
  arrange(chng_over) %>% select(-chng_over)
# A tibble: 7 x 4
# Groups: id, type [6]
# id    type  min_date   max_date  
# <chr> <chr> <date>     <date>    
# 1 1     A     2018-01-01 2018-01-02
# 2 1     B     2018-01-03 2018-01-04
# 3 1     A     2018-01-05 2018-01-05
# 4 2     A     2018-01-01 2018-01-01
# 5 2     B     2018-01-02 2018-01-05
# 6 3     B     2018-01-01 2018-01-02
# 7 3     A     2018-01-03 2018-01-05