R dplyr:如何利用分组信息与代码列表补全数据框缺失行?
用dplyr高效补全分组缺失项并填充NA
需求说明
输入数据框:
| group | items | value |
|---|---|---|
| grp1 | A | 1 |
| grp1 | B | 2 |
| grp2 | B | 3 |
需要为每个group补全指定项目列表item_codelist = c("A", "B", "C")中缺失的items项,对应value填充为NA,期望输出:
| group | items | value |
|---|---|---|
| grp1 | A | 1 |
| grp1 | B | 2 |
| grp1 | C | NA |
| grp2 | A | NA |
| grp2 | B | 3 |
| grp2 | C | NA |
示例输入代码:
item_codelist <- c("A", "B", "C") input <- data.frame("group" = c("grp1", "grp1", "grp2"), "items" = c("A", "B", "B"), "value" = c(1, 2, 3))
此前尝试fill()、extend()、complete()未成功,用for循环处理200MB数据效率极低,需基于dplyr的高效实现方法。
解决方案
使用dplyr结合tidyr::complete()即可实现,核心是指定分组列与补全项目列表,代码如下:
library(dplyr) library(tidyr) # 补全缺失项并填充NA output <- input %>% group_by(group) %>% complete(items = item_codelist, fill = list(value = NA)) %>% ungroup() # 查看结果 print(output)
代码解释
group_by(group):按group列分组,确保每个分组单独处理补全逻辑complete(items = item_codelist, fill = list(value = NA)):complete()会生成items列在item_codelist中的全量组合,通过fill参数指定缺失的value填充为NAungroup():取消分组,恢复为普通数据框格式
该方法为向量化操作,相比for循环效率提升显著,适配大体积数据处理场景。
内容的提问来源于stack exchange,提问作者mandmeier
相关产品推荐
相关产品推荐

