如何在R中按受访者组双向填充lost_income的缺失值?
基于基准行双向连续填充NA的R实现
示例输入数据
先构造符合需求的示例数据集:
library(tibble) df <- tibble( respondent_id = c(1,1,1,1,1,2,2,2,2), time = c(1,2,3,4,5,1,2,3,4), change = c(0, -1, NA, NA, NA, -1, NA, NA, 0), lost_income = c(NA, NA, 0, NA, NA, NA, 0, NA, NA) )
期望输出
# # A tibble: 9 × 4 # respondent_id time change lost_income # <dbl> <dbl> <dbl> <dbl> # 1 1 1 0 -2 # 2 1 2 -1 -1 # 3 1 3 NA 0 # 4 1 4 NA 1 # 5 1 5 NA 2 # 6 2 1 -1 -1 # 7 2 2 NA 0 # 8 2 3 NA 1 # 9 2 4 0 2
实现代码
使用dplyr分组后,通过基准行位置计算相对偏移量完成填充:
library(dplyr) df_filled <- df %>% group_by(respondent_id) %>% mutate( # 定位当前分组中lost_income=0的基准行位置 base_pos = which(lost_income == 0), # 计算每行相对基准行的偏移量,替换NA lost_income = row_number() - base_pos ) %>% ungroup()
代码逻辑说明
- 按
respondent_id分组,保证每个受访者的填充逻辑独立执行 - 通过
which(lost_income == 0)获取分组内基准行的行号 - 用当前行的
row_number()减去基准行号,得到双向连续的偏移值:基准行结果为0,向前依次递减为-1、-2…,向后依次递增为1、2… - 取消分组后得到最终填充完成的数据集
内容的提问来源于stack exchange,提问作者R_Punzel
相关产品推荐
相关产品推荐

