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

R语言中如何将指定wave的ipref值滞后填充至对应wave全部行?

正确实现跨wave的ipref值填充方案

你之前用lag()的问题在于,它是按分组后的行顺序逐行偏移,而同一个wave下有两行数据,导致wave20的第二行(loyal=1)取到了同wave第一行(loyal=0)的ipref值,而非对应前置wave(16/36)的数值。以下是两种可行的解决方案:

方法一:直接匹配前置wave的对应值

利用分组内的wave对应关系(16→20、36→40),直接提取对应前置wave的ipref值:

library(dplyr)

df <- df %>% 
  group_by(party, area) %>% 
  mutate(
    # 为当前wave匹配对应的前置wave,并提取对应ipref值
    l_ipref_1 = ipref_1[wave == case_when(wave == 20 ~ 16, wave == 40 ~ 36)],
    l_ipref_2 = ipref_2[wave == case_when(wave == 20 ~ 16, wave == 40 ~ 36)],
    l_ipref_3 = ipref_3[wave == case_when(wave == 20 ~ 16, wave == 40 ~ 36)]
  ) %>% 
  ungroup()

方法二:先提取基准行再合并

先单独提取loyal为NA的基准行(wave16、36),再通过wave映射关系合并到目标行:

library(dplyr)

# 提取基准行并设置目标wave
base_data <- df %>% 
  filter(is.na(loyal)) %>% 
  mutate(target_wave = ifelse(wave == 16, 20, 40)) %>% 
  select(party, area, target_wave, starts_with("ipref")) %>% 
  rename_with(~paste0("l_", .), starts_with("ipref"))

# 合并到原数据框
df <- df %>% 
  left_join(base_data, by = c("party", "area", "wave" = "target_wave"))

验证结果

两种方法都能实现预期效果:

  • wave20的两行l_ipref_1/l_ipref_2/l_ipref_3均为wave16对应的值(0.25、0.5、-0.5)
  • wave40的两行l_ipref_1/l_ipref_2/l_ipref_3均为wave36对应的值(-0.25、-0.75、0.5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:56:09