2015-05-11 4 views
4

У меня есть таблица данных с транзакциями. Среди прочего, транзакции отмечены датой/временем и клиентом.Поиск информации из предыдущего наблюдения в R

library(data.table) 
transactions <- data.table(trans.id = 1:10, 
          customer.id = c(rep(c('a','b'),3),'c')) 
set.seed(42) 
transactions[, time := sample(500, 10, T)] 

Для каждой транзакции я хочу посмотреть предыдущую транзакцию клиента, чтобы я мог делать такие вещи, как подсчитать время со времени последней транзакции. Это лучшее, что я смог сделать ...

Find.Prior.ID <- function(id.curr) { 
    trans.curr <- transactions[trans.id == id.curr] 
    time.curr <- trans.curr[, time] 
    customer <- trans.curr[, customer.id] 
    prior.trans <- transactions[ 
    time < time.curr & customer.id == customer] 
    if (dim(prior.trans)[1] == 0) {return(NA)} 
    time.prior <- prior.trans[,max(time)] 
    id.prior <- prior.trans[ 
    time == time.prior, 
    trans.id] 
    return(id.prior) 
} 

transactions[, prior.id := unlist(lapply(
    X = trans.id, FUN = Find.Prior.ID))] 

После того, как я prior.id заселена простой слияние позволяет мне карту в любой другой информации я хочу. Моя проблема действительно сводится к времени выполнения. Эта конструкция имеет навязчиво длительное время. Есть ли способ сделать это быстрее?

ОТВЕТ (специфичный к примеру, в вопросе)

setorder(transactions, time) 
transactions[, prior.id:=c(NA,trans.id[-.N]), by=customer.id] 
+1

ли 'сделок [, prior.id: = C (. NA, trans.id [1 :(N-1)]), с помощью = customer.id]' создать правильно на 'prior.id' столбец? – nicola

+4

@nicola можно использовать '-.N', как в' transaction [, prior.id: = c (NA, trans.id [-. N]), by = customer.id] ' –

+0

Я изменил пример, чтобы продемонстрировать некоторые предостережения в идее Никола (один из кодов Дэвида). Если кто-то из вас позаботится об этом, я отвечу. – Adam

ответ

5

В data.table версия 1.9.5 есть новый shift функция, которая принимает аргумент type = lag для вычисления лага переменного.

transactions[, prior.id := shift(trans.id, type = "lag"), by = customer.id] 
+1

'type =" lag "' по умолчанию, поэтому не нужно указывать его, я думаю. –

+0

Похоже, что 1.9.5 еще не выпущен в CRAN? – Adam

+0

Вы можете установить его из [github] (https://github.com/Rdatatable/data.table/wiki/Installation) – shadow

Смежные вопросы