Настройте некоторые тестовые данные:
DF <- data.frame(t = 1:4, p = rep(1:3, each = 4), value = 1:12)
и теперь у нас есть три решения.Сначала мы используем sqldf в соответствии с запросом, используя базу данных SQLite по умолчанию.Затем мы снова делаем это с sqldf, но на этот раз с PostgreSQL, используя драйвер RPostgreSQL или RpgSQL .PostgreSQL поддерживает аналитические оконные функции, которые упрощают SQL.Для этого вам нужно сначала настроить базу данных PostgreSQL.Наконец, мы показываем решение на чистом R, которое использует только ядро R.
1) sqldf / RSQLite
library(sqldf)
sqldf("select a.*, sum(b.value) as cumsum
from DF a join DF b
using (p)
where a.t >= b.t
group by p, a.t"
)
2) sqldf / RPostgreSQL
library(RPostgreSQL)
library(sqldf)
sqldf('select *,
sum(value) over (partition by p order by t) as cumsum
from "DF"'
)
(Это также работает с драйвером RpgSQL PostgreSQL. Чтобы использовать это, у вас должна быть установлена Java и настроена база данных PostgreSQL, а затем вместо вышеуказанного используйте: 1ibrary(RpgSQL); sqldf(...)
, где то же самоеСтрока SQL используется за исключением того, что в кавычках не должно быть DF
.)
3) Обычный R
transform(DF, cumsum = ave(value, p, FUN = cumsum))