R语言按条件补全缺失行:为站点日期缺失组合填充0计数
补全站点-日期全组合数据集的实现方案
以下提供两种主流数据处理工具的实现代码:
Python(pandas 实现)
核心逻辑是先构造所有站点和日期的笛卡尔积作为基准全表,再和原数据集左连接后对缺失计数值填0:
import pandas as pd # 1. 定义研究涉及的全量站点、日期列表 all_sites = ["SVC", "BMA", "SVA", "BMC", "TMA", "TMC", "SRA", "SRC", "MCC"] all_dates = ["2021/6/1", "2021/6/7", "2021/6/15", "2021/6/21", "2021/6/29"] # 2. 构造站点+日期的全量组合基准表 # 注意:names参数的值需要和DF1中对应的站点、日期列名完全一致 full_base = pd.MultiIndex.from_product( [all_sites, all_dates], names=["站点", "日期"] ).to_frame(index=False) # 3. 左连接原数据集,缺失的计数字段填充0 df_full = full_base.merge(DF1, on=["站点", "日期"], how="left").fillna(0) # 若仅需要对指定的n个计数字段填0,可指定列填充,避免其他字段被错误补0: # count_cols = ["计数列1", "计数列2"] # 替换为实际的计数字段名 # df_full[count_cols] = df_full[count_cols].fillna(0)
R(tidyverse 实现)
用crossing快速生成全量组合,左连接后对计数字段缺失值替换为0:
library(tidyverse) # 1. 定义全量站点、日期向量 all_sites <- c("SVC", "BMA", "SVA", "BMC", "TMA", "TMC", "SRA", "SRC", "MCC") all_dates <- as.Date( c("2021/6/1", "2021/6/7", "2021/6/15", "2021/6/21", "2021/6/29"), format = "%Y/%m/%d" ) # 2. 生成全量组合后左连接补0 # 注意:by参数的值需要和DF1中对应的站点、日期列名完全一致 df_full <- crossing(站点 = all_sites, 日期 = all_dates) %>% left_join(DF1, by = c("站点", "日期")) %>% # 若所有数值列都是计数字段,可直接用across(where(is.numeric), ~replace_na(., 0)) mutate(across(c(计数列1, 计数列2), ~replace_na(., 0)))
注意事项
- 全量表的站点、日期字段的类型要和原数据集完全一致,比如原数据日期是Date类型,构造全量表时就不要用字符串类型,避免连接匹配失败
- 如果原数据集存在站点、日期之外的其他分组维度,需要把这些维度也加入全量组合的构造逻辑中
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

