R语言实操:为销售数据中2021年缺失的邮编观测记录创建补全行
解决方案
核心逻辑是先用全量邮编、需要匹配的产品、待补全年份三个维度生成全量基准表,再和原有销售数据关联,缺失的供应状态直接填充为NO即可。
假设你的全量邮编数据集命名为zip_full,仅含ZIP列存储所有邮编;原始销售数据集命名为sales_raw,包含你提到的四个字段。
方法1:tidyverse 实现(逻辑直观,适合入门用户)
首先加载依赖包:library(tidyverse)
操作步骤:
- 生成2021年全量邮编+所有产品的匹配基准
full_base <- expand_grid( ZIP = zip_full$ZIP, # 如果仅需要补全TOY品类,把unique(...)替换为"TOY"即可 PRODUCT = unique(sales_raw$PRODUCT), YEAR = 2021 )
- 关联原有2021年销售数据,补全缺失值
# 提取原有2021年销售记录 sales_2021 <- sales_raw %>% filter(YEAR == 2021) # 左连接补全所有邮编的记录,缺失的供应状态填NO sales_2021_full <- full_base %>% left_join(sales_2021, by = c("ZIP", "PRODUCT", "YEAR")) %>% mutate(AVAILABILITY = replace_na(AVAILABILITY, "NO"))
- 合并原有2020年数据和补全后的2021年数据,得到最终数据集
sales_final <- sales_raw %>% filter(YEAR != 2021) %>% bind_rows(sales_2021_full)
方法2:基础R实现(无需安装额外依赖包)
# 生成全量匹配基准 all_zip <- zip_full$ZIP all_product <- unique(sales_raw$PRODUCT) full_base <- expand.grid(ZIP = all_zip, PRODUCT = all_product, YEAR = 2021, stringsAsFactors = FALSE) # 关联原有2021年销售数据 sales_2021 <- sales_raw[sales_raw$YEAR == 2021, ] merge_2021 <- merge(full_base, sales_2021, by = c("ZIP", "PRODUCT", "YEAR"), all.x = TRUE) # 填充缺失的供应状态 merge_2021$AVAILABILITY[is.na(merge_2021$AVAILABILITY)] <- "NO" # 合并得到最终数据集 sales_final <- rbind(sales_raw[sales_raw$YEAR != 2021, ], merge_2021)
注意:上述代码默认会给数据集中所有产品补全全量邮编的2021年记录,如果你只需要补全TOY这一个产品的记录,把代码里的
unique(sales_raw$PRODUCT)直接替换为"TOY"即可。
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

