1

我有一个数据集如下

 Id     Date1                
 121    2011-01-03
 121    2011-01-03
 121    2011-04-02
 121    2011-08-14
 121    2012-01-14
 121    2012-05-12
 975    2011-02-01
 975    2011-02-01
 975    2011-06-14
 975    2012-01-06
 975    2012-04-19
 975    2012-09-25

我要创建的是如下所示的输出,其中新的 Date2 列根据 id 偏移一个值,

 Id     Date1        Date2                         
 121    2011-01-03   2011-01-03
 121    2011-01-03   2011-04-02
 121    2011-04-02   2011-08-14
 121    2011-08-14   2012-01-14
 121    2012-01-14   2012-05-12 
 121    2012-05-12   NA

 975    2011-02-01   2011-02-01
 975    2011-02-01   2011-06-14
 975    2011-06-14   2012-01-06
 975    2012-01-06   2012-04-19
 975    2012-04-19   2012-09-25
 975    2012-09-25   NA

Id 121 的 Date2 列第 2 行,即 2011-01-03 成为 Id 121 的 Date1 列,row1 值。

Id 121 的 Date2 列 row3 即 2011-04-02 变为 Date1 列,Id 121 的 row2 值......依此类推......这应该由 id 发生。

任何帮助表示赞赏。

4

1 回答 1

2

使用,我们可以按“Id”分组并使用和dplyr创建一个新列“Date2”mutatelead

library(dplyr)
df1 %>%
     group_by(Id) %>% 
     mutate(Date2= lead(Date1))
# Id      Date1      Date2
#1  121 2011-01-03 2011-01-03
#2  121 2011-01-03 2011-04-02
#3  121 2011-04-02 2011-08-14
#4  121 2011-08-14 2012-01-14
#5  121 2012-01-14 2012-05-12
#6  121 2012-05-12         NA
#7  975 2011-02-01 2011-02-01
#8  975 2011-02-01 2011-06-14
#9  975 2011-06-14 2012-01-06
#10 975 2012-01-06 2012-04-19
#11 975 2012-04-19 2012-09-25
#12 975 2012-09-25         NA

或者使用开发版本的类似选项data.table将'data.frame'转换为'data.table'(setDT(df1)),按'Id'分组,并使用shift带有选项的函数type='lead'

library(data.table)#v1.9.5+
setDT(df1)[, Date2:= shift(Date1, type='lead') , by = Id][]
#      Id      Date1      Date2
# 1: 121 2011-01-03 2011-01-03
# 2: 121 2011-01-03 2011-04-02
# 3: 121 2011-04-02 2011-08-14
# 4: 121 2011-08-14 2012-01-14
# 5: 121 2012-01-14 2012-05-12
# 6: 121 2012-05-12         NA
# 7: 975 2011-02-01 2011-02-01
# 8: 975 2011-02-01 2011-06-14
# 9: 975 2011-06-14 2012-01-06
#10: 975 2012-01-06 2012-04-19
#11: 975 2012-04-19 2012-09-25
#12: 975 2012-09-25         NA

或者我们可以使用avefrom base R。我们按“Id”列分组,删除第一个观察结果并NA在最后连接。

df1$Date2 <- with(df1, ave(Date1, Id, FUN=function(x) c(x[-1], NA)))
于 2015-08-07T07:01:37.453 回答