Я хочу пройтись по длинному списку столбцов в крупномасштабном кадре данных и вычислить кумулятивные суммы по запаздывающим значениям столбцов.Другими словами, я как бы подсчитываю, сколько было «сделано» перед каждым наблюдением.
Игрушечный фрейм данных, чтобы помочь сделать это более ясным.
id = c("a", "a", "a", "b", "b")
date = seq(as.Date("2015-12-01"), as.Date("2015-12-05"), by="days")
v1 = sample(seq(1, 20), 5)
v2 = sample(seq(1, 20), 5)
df = data.frame(id, date, v1, v2)
Я хочу, чтобы он выглядел как
id date v1 v2 v1Cum v2Cum
a 2015-12-01 1 13 0 0
a 2015-12-02 7 11 1 13
a 2015-12-03 12 2 8 24
b 2015-12-04 18 6 0 0
b 2015-12-05 4 9 18 6
Так что это не кумулятивная сумма v1 или v2 в пределахгруппы идентификаторов, а скорее накопленная сумма отстающих значений каждого идентификатора.
Я могу сделать это для отдельных столбцов без проблем, но я не могу обобщить это с помощью цикла:
vars = c("v1", "v2")
for (var in vars) {
lagname = paste(var, "Lag", sep="")
cumname = paste(var, "Cum", sep="")
df = arrange(df, id, date)
df = df %>%
group_by(id) %>%
mutate(!!lagname := dplyr::lag(var, n = 1, default = NA))
df[[lagname]] = ifelse(is.na(df[[lagname]]), 0, df[[lagname]])
df = df %>% group_by(id) %>% arrange(date) %>% mutate(!!cumname := cumsum(!!lagname))
}
Проблемы, на мой взгляд, состоят в том, что
- переменная запаздывания просто оценивается как NA (или 0 после ifelse ()).Я знаю, что не совсем прибил mutate ().
- Суммарное суммирование оценивается как NA
Есть идеи?Спасибо за помощь!(Я пытаюсь вернуться к кодированию после паузы в пару лет. Однако моим основным «языком» был Stata, поэтому я представляю, что подхожу к этому немного странно. Рад полностью пересмотреть это!)