按 id 偏移日期列内容
offset date column content by id
我有一个数据集如下
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 变为 Date1 列,Id 121 的第 1 行值。
ID 121 的日期 2 列第 3 行,即 2011-04-02 变为日期 1 列,ID 121 的行 2 值....依此类推...这应该由 id 发生。
感谢任何帮助。
使用 dplyr
,我们可以按 'Id' 分组并使用 mutate
和 lead
创建一个新列 'Date2'
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' 分组,并使用带有选项 type='lead'
的 shift
函数
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
或者我们可以使用 base R
中的 ave
。我们按 'Id' 列分组,删除第一个观察值并在末尾与 NA
连接。
df1$Date2 <- with(df1, ave(Date1, Id, FUN=function(x) c(x[-1], NA)))
我有一个数据集如下
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 变为 Date1 列,Id 121 的第 1 行值。
ID 121 的日期 2 列第 3 行,即 2011-04-02 变为日期 1 列,ID 121 的行 2 值....依此类推...这应该由 id 发生。
感谢任何帮助。
使用 dplyr
,我们可以按 'Id' 分组并使用 mutate
和 lead
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' 分组,并使用带有选项 type='lead'
shift
函数
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
或者我们可以使用 base R
中的 ave
。我们按 'Id' 列分组,删除第一个观察值并在末尾与 NA
连接。
df1$Date2 <- with(df1, ave(Date1, Id, FUN=function(x) c(x[-1], NA)))