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
相关产品推荐
相关产品推荐

