【问题标题】:Rolling sum of days that are 1, with a reset if the value is equal to 01 天的滚动总和,如果值等于 0,则重置
【发布时间】:2019-05-03 19:20:50
【问题描述】:

假设我有这个数据集

我想要这个结果

我不知道该怎么做,但这是我的伪代码

problem = if_else(problem == 0, 0, 之前所有 1 的总和)

我试过了

数据集 % mutate(problem = if_else(problem == 0, 0, problem + lag(problem))

这只会让我得到一个 2 作为最高数字。我将如何做到这一点。此外,总计的列名也可能与问题不同。

【问题讨论】:

标签: r


【解决方案1】:

这是data.table 的选项。转换为data.tablesetDT),按'Problem'的rleid(run-length-id)分组,将'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))

数据

df1 <- data.frame(Problem = c(0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多