Скользящая сумма дней, равная 1, со сбросом, если значение равно 0 - PullRequest
0 голосов
/ 03 мая 2019

Предположим, у меня есть этот набор данных

enter image description here

Я хотел бы получить этот результат

enter image description here

Я не уверен, как это сделать, но вот мой псевдокод

problem = if_else (задача == 0, 0, сумма всех предыдущих 1)

Я пытался

набор данных <- набор данных%>% mutate (problem = if_else (problem == 0, 0, проблема + лаг (проблема))

Это только даст мне 2 какнаибольшее число. Как бы я это сделал. Кроме того, имя столбца для общей суммы может отличаться от проблемы.

1 Ответ

1 голос
/ 03 мая 2019

Вот вариант с data.table.Преобразуйте в data.table (setDT), сгруппированные по rleid (id-длины-длины) в «Problem», умножьте «Problem» на номер строки (seq_len(.N)) и присвойте (:=)это «Проблема»

library(data.table)
setDT(df1)[, Problem := seq_len(.N) * Problem, rleid(Problem)]
df1
#    Problem
# 1:       0
# 2:       1
# 3:       2
# 4:       3
# 5:       0
# 6:       0
# 7:       1
# 8:       2
# 9:       0
#10:       0
#11:       1

Или с использованием base R

with(rle(df1$Problem), sequence(lengths) * rep(values, lengths))

data

df1 <- data.frame(Problem = c(0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...