在dplyr中按组生成前一行ticket_num衍生变量的方法(解决lag跨组赋值与case_when语法错误问题)
按组生成前一行ticket_num衍生变量的解决方案
嗨,我来帮你搞定这个问题!你需要的是在分组后使用lag()函数,这样就能保证只在同一个group_id内部取前一行的ticket_num值,完全符合你的需求。
需求回顾
你有一组已按group_id分组、date排序的数据,想要创建prior_ticket变量:
- 同组内下一行记录继承上一行的
ticket_num - 组内第一行的
prior_ticket为NA
输入数据
| date | group_id | ticket_num |
|---|---|---|
| 1/1/22 | A | 12345A |
| 1/1/22 | A | 54321A |
| 1/3/22 | A | 56789A |
| 1/1/22 | B | 98765A |
| 1/2/22 | B | 01234A |
期望输出
| date | group_id | ticket_num | prior_ticket |
|---|---|---|---|
| 1/1/22 | A | 12345A | NA |
| 1/1/22 | A | 54321A | 12345A |
| 1/3/22 | A | 56789A | 54321A |
| 1/1/22 | B | 98765A | NA |
| 1/2/22 | B | 01234A | 98765A |
正确解决方案
直接对group_id分组后使用lag()函数,这样lag()会在每个组内部独立计算前一行的值,不会跨组干扰:
library(dplyr) my_data %>% group_by(group_id) %>% mutate(prior_ticket = lag(ticket_num)) %>% ungroup() # 可选,如果你后续不需要保留分组状态,可以加上这一行
运行这段代码后,就能得到你想要的结果啦!
你之前尝试方法的问题分析
第一种方法:
my_data %>% mutate(prior_ticket = lag(ticket_num))问题出在没有分组,
lag()会对整个数据集的前一行取值,导致B组第一行的prior_ticket会取到A组最后一行的56789A,不符合组内独立计算的要求。第二种方法:
my_data %>% mutate(prior_ticket = case_when(group_id == lead(group_id) ~ lead(ticket_num), TRUE ~ NA))首先是逻辑错误:你想用
lead()来判断后一行是否同组,但实际上我们需要的是取当前行的前一行值,而不是后一行;其次代码可能存在语法格式问题(比如公式对象的错误提示),但核心是这种思路绕远了,分组+lag()才是最直接的解决方案。
内容的提问来源于stack exchange,提问作者AJD
相关产品推荐
相关产品推荐

