在R中保留上一个日期

时间:2013-11-28 15:55:25

标签: 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-16
3 22 2013-11-15
4 22 2013-11-16
5 22 2013-11-17

我正在寻找一种方法来保留上一笔交易的日期。结果表如下所示:

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

  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

我研究了其他类似的问题和一个非常接近我想要的解决方案:

library(data.table)
dt <- as.data.table(example)

prev_date <- function(x) c(x[1],x)

dt[,prev:=prev_date(dates), by=id]

这个问题是如果没有前一个日期(就像id = 11 dates = 2013-11-15 那样),该函数会输出相同的日期,结果是:

  id      dates previous_dates
1 11 2013-11-15     2013-11-15
2 11 2013-11-16     2013-11-15

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

使用Date对象的类....这也有效:

example$previous_dates <- ave(example$dates, example$id,
             FUN=  function(dt) structure( 
                                  c(NA, dt[-length(dt)]),
                                  class="Date" )  )

答案 2 :(得分:1)

另一种方法:

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