如何基于年份复制行数据,扩展州政策数据集(优先dplyr方案)
问题描述
现有一份州政策数据集,仅记录政策发生变化的年份,示例数据如下:
df_have <- data.frame(state = c("AL", "AL", "AL", "AK", "AK", "AZ"), year= c(2015, 2017, 2020, 2015, 2019, 2015), policy= c(1, 2, 3, 1, 2, 1))
需要将数据集扩展至所有中间年份,复制上一年的政策值直到新政策出现,最终目标数据集如下:
df_want <- data.frame(state = c("AL", "AL", "AL", "AL", "AL", "AL", "AK", "AK", "AK", "AK", "AK", "AK", "AZ", "AZ", "AZ", "AZ", "AZ", "AZ"), year= c(2015, 2016, 2017, 2018, 2019, 2020, 2015, 2016, 2017, 2018, 2019, 2020, 2015, 2016, 2017, 2018, 2019, 2020), policy= c(1, 1, 2, 2, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1))
dplyr解决方案
结合dplyr和tidyr的函数可以快速实现需求,代码如下:
library(dplyr) library(tidyr) df_result <- df_have %>% group_by(state) %>% complete(year = full_seq(year, 1)) %>% fill(policy, .direction = "down") %>% ungroup()
代码说明
group_by(state):按州分组,保证每个州的年份补全逻辑独立执行complete(year = full_seq(year, 1)):生成该州记录年份的连续序列,补全中间缺失的年份,此时新增年份的policy值为NAfill(policy, .direction = "down"):将上一个非NA的政策值向下填充,实现"复制上一年政策直到新变化"的效果ungroup():取消分组,回归普通数据框格式
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

