Я застрял в довольно простой задаче для сбора данных. У меня есть транзакционной кадр данных в R, который напоминает этот один:Сохранение предыдущей даты в 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]
Проблема с этим в том, что если нет предыдущей даты (, как и в случае J = 11 дат = 2013-11-15) функции будет выводить то же день в результате:
id dates previous_dates
1 11 2013-11-15 2013-11-15
2 11 2013-11-16 2013-11-15
Может кто-нибудь помочь, пожалуйста?
Этот тоже работает. Спасибо DWin! –
На самом деле ваше решение работает быстрее, чем Roland при применении к большому набору данных. –
@NikolayNenov Если ваш набор данных действительно большой и есть много идентификаторов, вы должны использовать data.table. Я только вчера не показывал, как это сделать, потому что я не нашел решения для сохранения класса Date и ему нужно было бы сделать что-то вроде Dwin, используемого в первой ревизии его ответа. – Roland