如何根据组内前一行值转换后续行值?

How to transform subsequent row values based on previous row value, inside groups?

我是 R 和一般数据编程的新手。请原谅此解释中的任何最终混淆。

我正在开发一个跨年跟踪单位的数据库。这些参加或不参加计划。 1 表示参与,0 表示参与。

我想添加一个列,其参与状态在第一个治疗年之后仍保持治疗状态,与治疗开始时间无关。基本上:一次治疗,永远治疗。

示例:

假设我有一个这样的 df:

units <- c("A1","A1","A1","A1","A2","A2","A2","A2","A3","A3","A3","A3")
years <- c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1993, 1990, 1991, 1992, 1993)
treated <- c(0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1)
df <- data.frame(units,years,treated)

所以 df 看起来像:

   units years treated
1  A1    1990  0
2  A1    1991  1
3  A1    1992  1
4  A1    1993  1
5  A2    1990  0
6  A2    1991  1
7  A2    1992  0
8  A2    1993  0
9  A3    1990  0
10 A3    1991  0
11 A3    1992  0
12 A3    1993  1

单元 A1 和 A3 没问题。我的问题是 A2 单元。我想创建一个新列,其中 1991 年之后的年份也产生值“1”。

我想要的输出是这样的:

   units years treated treated2
1  A1    1990  0       0
2  A1    1991  1       1
3  A1    1992  1       1
4  A1    1993  1       1
5  A2    1990  0       0
6  A2    1991  1       1
7  A2    1992  0       1
8  A2    1993  0       1
9  A3    1990  0       0
10 A3    1991  0       0
11 A3    1992  0       0
12 A3    1993  1       1

这个例子被简化了。我的原始数据库跟踪了 15 年的数千个单位。

我尝试过使用dplyr函数作为'group_by'和'if_else',但我还没有取得令人满意的结果。

提前致谢!

按'units'

分组后我们可以使用cummax
library(dplyr)
df %>% 
   group_by(units) %>%
   mutate(treated2 = cummax(treated)) %>%
   ungroup

-输出

# A tibble: 12 x 4
#   units years treated treated2
#   <chr> <dbl>   <dbl>    <dbl>
# 1 A1     1990       0        0
# 2 A1     1991       1        1
# 3 A1     1992       1        1
# 4 A1     1993       1        1
# 5 A2     1990       0        0
# 6 A2     1991       1        1
# 7 A2     1992       0        1
# 8 A2     1993       0        1
# 9 A3     1990       0        0
#10 A3     1991       0        0
#11 A3     1992       0        0
#12 A3     1993       1        1