如何为数据框各观测个体补充行以统一观测数(LOCF方法)
长格式数据按个体补全至最大观测数(LOCF方法)
针对需求,这里提供两种常用的R语言实现方案,先确定所有个体中的最大观测行数,再对每个个体补全行并使用最后一次观测结转(LOCF)填充缺失值:
方法一:使用dplyr + tidyr包
属于tidyverse生态方案,代码可读性强:
library(dplyr) library(tidyr) # 计算所有id里的最大观测行数 max_n <- d %>% count(id) %>% pull(n) %>% max() # 分组补全行并应用LOCF填充 result <- d %>% group_by(id) %>% # 把每个id的行扩展到max_n行,不足位置生成NA complete(rowid = 1:max_n) %>% # 向下填充NA,即用最后一次观测值补全 fill(value, .direction = "down") %>% # 移除临时生成的rowid列,恢复原数据结构 select(-rowid) %>% ungroup() # 查看结果 print(result)
方法二:使用data.table包
适合处理大规模数据集,运行效率更高:
library(data.table) # 转换为data.table格式 setDT(d) # 计算最大观测行数 max_n <- d[, .N, by = id][, max(N)] # 补全行并执行LOCF填充 result <- d[, .SD[rep(.I, max_n)][1:max_n], by = id] %>% .[, value := nafill(value, type = "locf"), by = id] # 查看结果 print(result)
两种方法最终都会得到符合要求的结果:个体1补充2行value=12,个体2补充3行value=9,个体3保持原有的5行数据。
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

