我有一个包含日期和客户名称的数据框。我希望添加一个返回的日期,这是客户下次返回我的数据集时。在R中最简单的方法是什么?如果客户尚未返回,则结果应为空白。
Date <-seq(as.Date('2017/01/01'), as.Date('2017/01/9'), by="day")
Cust <- c("A","B","C","A","B","C","A","B","C")
df1 <- data.frame(Date,Cust)
Date Cust
1 01/01/17 A
2 02/01/17 B
3 03/01/17 C
4 04/01/17 A
5 05/01/17 B
6 06/01/17 C
7 07/01/17 A
8 08/01/17 B
9 09/01/17 C
预期结果
Date Cust returnedDate
1 01/01/17 A 04/01/17
2 02/01/17 B 05/01/17
3 03/01/17 C 06/01/17
4 04/01/17 A 07/01/17
5 05/01/17 B 08/01/17
6 06/01/17 C 09/01/17
7 07/01/17 A NA
8 08/01/17 B NA
9 09/01/17 C NA
答案 0 :(得分:2)
我们可以使用shift
data.table
操作中的小组来执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)
),按&#39; Cust&#39;分组,获得&#39;日期&#39;的主要值并将(:=
)指定为&#39; returnDate&#39;
library(data.table)
setDT(df1)[, returnDate := shift(Date, type = "lead"), Cust]
df1
# Date Cust returnDate
#1: 2017-01-01 A 2017-01-04
#2: 2017-01-02 B 2017-01-05
#3: 2017-01-03 C 2017-01-06
#4: 2017-01-04 A 2017-01-07
#5: 2017-01-05 B 2017-01-08
#6: 2017-01-06 C 2017-01-09
#7: 2017-01-07 A <NA>
#8: 2017-01-08 B <NA>
#9: 2017-01-09 C <NA>
注意:如果OP希望“约会”采用某种格式,请使用format