Мне нужно сделать быструю агрегацию по id_client дат: min, max, разница дат в месяцах и количество месяцев.
Пример таблицы:
tbl<-data.frame(id_cliente=c(1,1,1,1,2,3,3,3),
fecha=c('2013-01-01', '2013-06-01','2013-05-01', '2013-04-01', '2013-01-01', '2013-01-01','2013-05-01','2013-04-01'))
Даты формата:
tbl$fecha<-as.Date(as.character(tbl$fecha))
Мой первый подход был ddply:
tbl2<-ddply(tbl, .(id_cliente), summarize, cant=length(id_cliente),
max=max(fecha), min=min(fecha),
dif=length(seq(from=min, to=max, by='month')))
Я получил желаемый результат, но с моей реальной таблицей занимает слишком много времени. Итак, я попробовал нажать:
tbl3<-data.frame(cbind(dif=tapply(tbl$fecha, list(tbl$id_cliente), secuencia),
hay=tapply(tbl$fecha, list(tbl$id_cliente), length),
min=tapply(tbl$fecha, list(tbl$id_cliente), min),
max=tapply(tbl$fecha, list(tbl$id_cliente), max)
))
В результате:
> tbl3
dif hay min max
6 4 15706 15857
1 1 15706 15706
5 3 15706 15826
В данном случае я получил вместо дат числа. Итак, поскольку следующее работает, я попытался использовать as.Date внутри tapply:
as.Date(15706, origin='1970-01-01')
MIN<-function(x){as.Date(min(x), origin='1970-01-01')}
Функция работает, но с tapply нет.
tbl3<-data.frame(cbind(min=tapply(tbl$fecha, list(tbl$id_cliente), MIN)))
И я все еще получил номер вместо даты. Как я могу это решить? Спасибо.