一列日期变成两列日期
我有以下输入
id date
GAB 2018-02-06
GAB 2018-02-08
GEW 2018-02-09
GEW 2018-02-10
GEW 2018-02-13
GAB 2018-02-14
GAB 2018-02-17
EWP 2018-02-25
EWP 2018-02-26
EWP 2018-02-27
我想要以下输出。
id start end
GAB 2018-02-06 2018-02-08
GEW 2018-02-09 2018-02-13
GAB 2018-02-14 2018-02-17
EWP 2018-02-25 2018-02-27
有什么简单的方法可以做到吗?
回答
我们可以按rleid
“身份证”与“ID”一起,并获得min
和max
“日期”的summarise
library(dplyr)
library(data.table)
df1 %>%
group_by(id, grp = rleid(id)) %>%
# // or do the cumulative sum of a logical vector from
# // comparing with the previous adjacent value
# group_by(grp = cumsum(id != lag(id, default = first(id))), id) %>%
summarise(start = min(date), end = max(date), .groups = 'drop') %>%
select(-grp)
-输出
# A tibble: 4 x 3
# id start end
# <chr> <date> <date>
#1 EWP 2018-02-25 2018-02-27
#2 GAB 2018-02-06 2018-02-08
#3 GAB 2018-02-14 2018-02-17
#4 GEW 2018-02-09 2018-02-13
下面的评论不正确,因为它会从输出中删除“id”列。
数据
df1 <- structure(list(id = c("GAB", "GAB", "GEW", "GEW", "GEW", "GAB",
"GAB", "EWP", "EWP", "EWP"), date = structure(c(17568, 17570,
17571, 17572, 17575, 17576, 17579, 17587, 17588, 17589), class = "Date")),
row.names = c(NA,
-10L), class = "data.frame")