我正在尝试使用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}}
我错过了什么?
答案 0 :(得分:1)
你非常接近解决方案。在应用date_collected
之前,您需要将Date
列转换为min/max
类型。使用lubridate
和dplyr
的一个选项是:
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