首页 > 解决方案 > 从长格式数据中获取下一个日期

问题描述

我有一个像这样工作的数据集:

id= c("A1", "A1", "B2", "C3", "C3", "C3")
move= c(1, 2, 1, 1, 2, 3)
max = c(2, 2, 1, 3, 3, 3)
date= c("1/1/1990", "1/4/1990", "1/1/1995", "4/1/1992", "6/1/1996", "1/1/1998")
df <-data.frame(id, move, date)

df$date <- as.Date(df$date,format = "%m/%d/%Y")

其中 id 代表一个人,move 代表一个移动顺序,date 代表移动发生的时间,max 是给定 id 进行的最大移动次数。

我想要的是下一个列,其中包含下一步的日期。

所以基本上,我想做的伪代码是:group.by(df$id),如果move < max,找到move+1的行并返回日期,否则返回NA

我希望最终看起来像这样:

  id move max     date  next
1 A1    1   2 1/1/1990  1/4/1990
2 A1    2   2 1/4/1990  NA
3 B2    1   1 1/1/1995  NA
4 C3    1   3 4/1/1992  6/1/1996
5 C3    2   3 6/1/1996  1/1/1998
6 C3    3   3 1/1/1998  NA

该数据集有超过 8500 万个观测值和更多变量,所以我真的很想避免将它从长切换到宽,如果可能的话再切换回来!

标签: r

解决方案


lead我们可以使用包中的窗口函数dplyr

library(dplyr)
df %>% 
    group_by(id) %>% 
    mutate(next_move = lead(date))

输出:

id     move date       next_move 
  <chr> <dbl> <date>     <date>    
1 A1        1 1990-01-01 1990-01-04
2 A1        2 1990-01-04 NA        
3 B2        1 1995-01-01 NA        
4 C3        1 1992-04-01 1996-06-01
5 C3        2 1996-06-01 1998-01-01
6 C3        3 1998-01-01 NA   

推荐阅读