You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在dplyr中按组生成前一行ticket_num衍生变量的方法(解决lag跨组赋值与case_when语法错误问题)

按组生成前一行ticket_num衍生变量的解决方案

嗨,我来帮你搞定这个问题!你需要的是在分组后使用lag()函数,这样就能保证只在同一个group_id内部取前一行的ticket_num值,完全符合你的需求。

需求回顾

你有一组已按group_id分组、date排序的数据,想要创建prior_ticket变量:

  • 同组内下一行记录继承上一行的ticket_num
  • 组内第一行的prior_ticket为NA

输入数据

dategroup_idticket_num
1/1/22A12345A
1/1/22A54321A
1/3/22A56789A
1/1/22B98765A
1/2/22B01234A

期望输出

dategroup_idticket_numprior_ticket
1/1/22A12345ANA
1/1/22A54321A12345A
1/3/22A56789A54321A
1/1/22B98765ANA
1/2/22B01234A98765A

正确解决方案

直接对group_id分组后使用lag()函数,这样lag()会在每个组内部独立计算前一行的值,不会跨组干扰:

library(dplyr)

my_data %>%
  group_by(group_id) %>%
  mutate(prior_ticket = lag(ticket_num)) %>%
  ungroup() # 可选,如果你后续不需要保留分组状态,可以加上这一行

运行这段代码后,就能得到你想要的结果啦!

你之前尝试方法的问题分析

  1. 第一种方法:

    my_data %>% mutate(prior_ticket = lag(ticket_num))
    

    问题出在没有分组,lag()会对整个数据集的前一行取值,导致B组第一行的prior_ticket会取到A组最后一行的56789A,不符合组内独立计算的要求。

  2. 第二种方法:

    my_data %>% mutate(prior_ticket = case_when(group_id == lead(group_id) ~ lead(ticket_num), TRUE ~ NA))
    

    首先是逻辑错误:你想用lead()来判断后一行是否同组,但实际上我们需要的是取当前行的前一行值,而不是后一行;其次代码可能存在语法格式问题(比如公式对象的错误提示),但核心是这种思路绕远了,分组+lag()才是最直接的解决方案。

内容的提问来源于stack exchange,提问作者AJD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:17:33