使用dplyr的lag函数在mutate中按id和t生成value滞后变量的结果异常问题排查
按ID分组生成滞后变量的问题排查与修正
嘿,我看到你在尝试给value字段按id和t生成滞后变量时遇到了结果不符合预期的问题,咱们来一步步拆解哪里出了问题:
你的代码核心问题:变量名冲突
你把分组处理后的数据集赋值给了变量t,但t同时也是你原数据框里的列名(时间列),这就造成了命名冲突——你后续查看的t大概率不是你生成的分组后的数据,而是原来的时间列数值,所以才会看到R1/R2/R3都和value一模一样的错误结果。
另外,虽然不是核心问题,但你的代码里保留原行名的操作orig <- rownames(d)其实对生成滞后变量没有影响,可以去掉。
修正后的代码
我们只需要把处理后的数据集赋值给一个不冲突的新变量名,同时确保分组逻辑正确即可:
# 先按id和t排序数据(这一步是对的,必须确保组内时间顺序正确) d <- d[order(d$id, d$t),] # 按id分组生成滞后变量,赋值给新变量d_lagged,避免命名冲突 d_lagged <- d %>% group_by(id) %>% mutate( R1 = lag(value, n = 1), # 滞后1期 R2 = lag(value, n = 2), # 滞后2期 R3 = lag(value, n = 3) # 滞后3期 ) %>% ungroup() # 可选:如果后续不需要保留分组状态,可以取消分组 # 查看最终结果 print(d_lagged)
修正后的输出结果
运行上面的代码后,你会得到符合预期的结果(默认lag函数会在没有前序值时返回NA,打印时会显示为空,和你期望的效果一致):
# A tibble: 6 × 6 id t value R1 R2 R3 <chr> <chr> <dbl> <dbl> <dbl> <dbl> 1 001 200001 1 NA NA NA 2 001 200002 1.5 1 NA NA 3 001 200003 0.75 1.5 1 NA 4 002 200001 1 NA NA NA 5 002 200002 1.58 1 NA NA 6 002 200003 0.5 1.58 1 NA
可选:把NA替换为空字符串
如果你希望空白位置显示为空字符串而不是NA,可以再加一步处理:
d_lagged <- d_lagged %>% mutate(across(c(R1, R2, R3), ~ifelse(is.na(.x), "", .x)))
这样打印出来的结果就和你给出的期望输出完全一致了。
内容的提问来源于stack exchange,提问作者dbraeuni
相关产品推荐
相关产品推荐

