R语言如何补齐仅偶数年有值的面板数据的奇数年缺失观测?
你需要的功能在R中可以快速实现,最简便的方法是使用tidyverse生态的函数,核心用到补全序列的complete()和缺失值填充的fill(),具体实现如下:
步骤1:加载依赖包
library(tidyverse)
步骤2:补全df2的奇数年观测
df2_full <- df2 %>% # 按state分组,保证每个州单独处理 group_by(state) %>% # 补全所有在df1中出现的年份,避免手动指定范围出错 complete(year = unique(df1$year)) %>% # 向上填充professionalism的缺失值,缺失值自动取下方最近的非缺失值,刚好匹配你的规则 fill(professionalism, .direction = "up") %>% ungroup()
运行上述代码得到的df2_full就是你需要的df2'结构。
步骤3:合并到df1
直接按年份和州做左连接即可:
df_final <- left_join(df1, df2_full, by = c("year", "state"))
如果你偏好基础R实现,也可以用如下方案(需要借助zoo包的na.locf函数处理缺失值填充):
library(zoo) # 生成所有州和年份的全组合 all_comb <- expand.grid(year = unique(df1$year), state = unique(df1$state)) # 合并df2得到带缺失值的全量数据 df2_full <- merge(all_comb, df2, by = c("year", "state"), all.x = TRUE) # 按州、年份排序 df2_full <- df2_full[order(df2_full$state, df2_full$year), ] # 按州分组,向上填充缺失值 df2_full$professionalism <- ave(df2_full$professionalism, df2_full$state, FUN = function(x) { rev(na.locf(rev(x))) }) # 合并到df1 df_final <- merge(df1, df2_full, by = c("year", "state"), all.x = TRUE)
内容的提问来源于stack exchange,提问作者slowpoke
相关产品推荐
相关产品推荐

