按PTNUM分组修正AGE_1列值:R语言dplyr实现求助
使用dplyr修正随访数据中AGE_1的连续性错误
原始数据集
| PTNUM | AGE_1 | AGE_2 | STATE_1 | STATE_2 |
|---|---|---|---|---|
| 123 | 15 | 18 | 1 | 2 |
| 123 | 15 | 23 | 2 | 2 |
| 123 | 23 | 28 | 2 | 3 |
| 124 | 15 | 17 | 1 | 1 |
| 124 | 17 | 25 | 1 | 1 |
| 124 | 25 | NA | 1 | 1 |
| 125 | 17 | 20 | 1 | 2 |
问题说明
同一PTNUM的随访数据中,每行的AGE_1应与上一行的AGE_2保持连续。其中PTNUM=123的第二行AGE_1错误填写为15,正确值应为上一行的AGE_2(18)。
修正后目标数据集
| PTNUM | AGE_1 | AGE_2 | STATE_1 | STATE_2 |
|---|---|---|---|---|
| 123 | 15 | 18 | 1 | 2 |
| 123 | 18 | 23 | 2 | 2 |
| 123 | 23 | 28 | 2 | 3 |
| 124 | 15 | 17 | 1 | 1 |
| 124 | 17 | 25 | 1 | 1 |
| 124 | 25 | NA | 1 | 1 |
| 125 | 17 | 20 | 1 | 2 |
你的尝试代码(未生效)
X6 <- X5 %>% group_by(PTNUM) %>% mutate( AGE1 = ifelse(lead(AGE2)==AGE1,AGE2, AGE1) )
代码问题分析
- 变量名不匹配:原数据列名为
AGE_1,代码中误用AGE1,导致无法正确关联变量。 - 逻辑方向错误:
lead(AGE2)获取的是下一行的AGE_2,但我们需要的是上一行的AGE_2来修正当前行的AGE_1,应使用lag()函数。 - 条件逻辑偏差:判断条件不符合实际需求,我们需要的是当前行
AGE_1与上一行AGE_2不一致时,用后者替换前者。
正确解决方案
使用dplyr的lag()函数获取上一行的AGE_2,每组第一行保留原始AGE_1,其余行替换为上一行的AGE_2:
library(dplyr) X6 <- X5 %>% group_by(PTNUM) %>% mutate( AGE_1 = if_else(row_number() == 1, AGE_1, lag(AGE_2)) ) %>% ungroup()
代码解释
group_by(PTNUM):按患者分组,确保仅在同一患者的随访记录内处理年龄连续性。row_number() == 1:每组第一行为初始记录,保留原始AGE_1值。lag(AGE_2):获取当前行上一行的AGE_2,替换当前行AGE_1,保证年龄连续。ungroup():处理完成后取消分组,避免影响后续操作。
运行代码后,PTNUM=123的第二行AGE_1会被修正为18,其余符合连续性的记录保持不变,与目标数据集一致。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

