r - 如何根据组内的前一行值转换后续行值?
问题描述
我一般是 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',但尚未取得令人满意的结果。
先感谢您!
解决方案
我们可以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
推荐阅读
- css - 图像替代文本的 css 填充
- google-sheets - 在 Google 表格中索引和匹配子集索引
- code-signing - 代码签名:哪些时间戳服务器更可靠?
- python - 在python中将一列取消嵌套到多列中
- python - 烧瓶表仅显示 Python 列表中的第一行,for 循环不适用于行
- flutter - Flutter Web url 名称不正确
- model-view-controller - 如何使用jquery获取以下代码的复选框选定值
- cygwin - Windows Server 上的 Tar 失败
- python - 在创建字典时设置字典的值
- sql - SQL 枢轴问题