Какой самый эффективный способ суммировать по всем наблюдениям за предыдущие годы - PullRequest
0 голосов
/ 23 января 2019

У меня есть аналогичный набор данных для следующего

Для каждого уникального года я хотел бы суммировать по всем договорам каждый уникальный идентификатор в наборе данных.Каков наилучший подход к такой проблеме?Мой набор данных намного больше, чем пример здесь.Я слышал, что for loops неэффективны для этого.

id <- rep(1:3, 4)
year <- (c(c(rep(1990, 3)), c(rep(1991, 3)), c(rep(1992, 3)), c(rep(1993, 3))) )
treaty <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1 )
data <- cbind(id, year, treaty)

Я пробовал что-то вроде этого, но мне не удалось, чтобы это работало.Могу ли я сделать это с пакетом plyr или dplyr?

for (i in unique(data$year)){
for (j in unique(data$year)){
  prior_temp <- sum(dat$treaty[which(dat$id==j & yearunique[1:i])])
 }
   dat$prior <- prior_temp
}

1 Ответ

0 голосов
/ 23 января 2019

Если под до вы подразумеваете текущий и предыдущий годы для этого id, тогда:

transform(data, prior = ave(treaty, id, FUN = cumsum))

или если вы действительно имеете в виду предыдущие годы для этого id, тогда:

transform(data, prior = ave(treaty, id, FUN = cumsum) - treaty)

С dplyr это будет так или замените cumsum(treaty) на cumsum(treaty) - treaty, если вы действительно имеете в виду предыдущий.

library(dplyr)

data %>%
  as.data.frame %>%
  group_by(id) %>%
  mutate(prior = cumsum(treaty)) %>%
  ungroup
...