保留R中的上一个日期

保留R中的上一个日期,r,data-munging,R,Data Munging,我被困在一个相当简单的数据搜索任务中。我在R中有一个事务数据帧,类似于: id<-c(11,11,22,22,22) dates<-as.Date(c('2013-11-15','2013-11-16','2013-11-15','2013-11-16','2013-11-17'), "%Y-%m-%d") example<-data.frame(id=id,dates=dates) id dates 1 11 2013-11-15 2 11 2013-11-1

我被困在一个相当简单的数据搜索任务中。我在R中有一个事务数据帧,类似于:

id<-c(11,11,22,22,22)
dates<-as.Date(c('2013-11-15','2013-11-16','2013-11-15','2013-11-16','2013-11-17'), "%Y-%m-%d")
example<-data.frame(id=id,dates=dates)

  id      dates
1 11 2013-11-15
2 11 2013-11-16
3 22 2013-11-15
4 22 2013-11-16
5 22 2013-11-17
有人能帮忙吗?

图书馆(plyr)
library(plyr)
example <- ddply(example, .(id), transform, 
                                  previous_dates=c(as.Date(NA), head(dates, -1)))
  id      dates previous_dates
1 11 2013-11-15           <NA>
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           <NA>
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16
示例
示例$previous\u日期示例
id日期以前的日期
1 11 2013-11-15           
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16
正在玩日期对象类。。。。这也适用于:

example$previous_dates <- ave(example$dates, example$id,
             FUN=  function(dt) structure( 
                                  c(NA, dt[-length(dt)]),
                                  class="Date" )  )
示例$previous_dates只是另一种方法:

transform(example, previous_dates = ave(dates, id, FUN = 
                                         function(x) x[c(NA, (seq_along(x)-1))]))

  id      dates previous_dates
1 11 2013-11-15           <NA>
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           <NA>
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16
transform(例如,以前的日期=ave(日期、id、乐趣=
函数(x)x[c(NA,(沿(x)-1)的顺序)])
id日期以前的日期
1 11 2013-11-15           
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16

我喜欢as.Date(NA)策略。在c()删除了我的日期类之后,我需要用as.Date.numeric重新确定日期。@DWin
c.Date(NA,head(dates,-1))
也可以。那么这是S3调度现象吗?第一个论点胜出,NA“没有阶级”。基本上。然而,
NA
有一个类。像一个符咒一样工作!谢谢罗兰!实际上,当应用于大型数据集时,您的解决方案比Roland的更快。@NikolayNenov如果您的数据集非常大并且有许多ID,您应该使用data.table。我只是昨天没有展示如何做,因为我没有找到保存Date类的解决方案,需要做一些类似于第一次修改答案时使用的Dwin的事情。
library(plyr)
example <- ddply(example, .(id), transform, 
                                  previous_dates=c(as.Date(NA), head(dates, -1)))
  id      dates previous_dates
1 11 2013-11-15           <NA>
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           <NA>
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16
example$previous_dates <- ave(example$dates, example$id,
                 FUN=  function(dt) c.Date( c(NA, dt[-length(dt)])
                                              ))
> example
  id      dates previous_dates
1 11 2013-11-15           <NA>
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           <NA>
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16
example$previous_dates <- ave(example$dates, example$id,
             FUN=  function(dt) structure( 
                                  c(NA, dt[-length(dt)]),
                                  class="Date" )  )
transform(example, previous_dates = ave(dates, id, FUN = 
                                         function(x) x[c(NA, (seq_along(x)-1))]))

  id      dates previous_dates
1 11 2013-11-15           <NA>
2 11 2013-11-16     2013-11-15
3 22 2013-11-15           <NA>
4 22 2013-11-16     2013-11-15
5 22 2013-11-17     2013-11-16