Такие функции, как aggregate
и tapply
, а также инструменты в plyr
, dplyr
и связанные с ними пакеты будут выполнять агрегирование за вас.Но все они ожидают единственную переменную, которая определяет группы для агрегирования.
Для вашего простого примера вы можете создать переменную группировки, используя такой код:
group <- cumsum(!is.na(mydata[['update-size']])
Другой вариант, если у вас естьдаты обновления, это использовать функцию findInterval
.
Пример:
> mydata <- data.frame(Date=c('01.01','01.02','01.03','01.01','01.02','01.03'),
+ x=c(1,2,4,5,2,5),
+ y=c(1,3,2,7,6,2),
+ id=c(1,1,1,2,2,2),
+ update.size =c(NA,2345,NA,2345,NA,4789)
+ )
>
> group <- cumsum(!is.na(mydata$update.size))
>
> # above aggregates with values after update
> # this line changes to aggregate with before
> group[ !is.na(mydata$update.size) ] <- group[ !is.na(mydata$update.size) ] -1
>
>
> aggregate(mydata[,2:4], list(group), FUN=sum)
Group.1 x y id
1 0 3 4 2
2 1 9 9 3
3 2 7 8 4
>