如何根据组内前一行值转换后续行值?
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
我是 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