一列日期变成两列日期

我有以下输入

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”一起,并获得minmax“日期”的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")


以上是一列日期变成两列日期的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>