求助:用R代码补全账户月度余额缺失数据适配ARIMA预测
解决ARIMA数据补全:R代码修正账户月度余额缺失值
问题根源
你遇到的全0记录问题,核心是日期格式不匹配:你生成的months是YYYY-MM-DD格式的字符串,但原数据中的Month是YYYYMM数字格式,两者在merge时完全无法匹配,导致所有balance字段都变成NA,最终被替换为0。
修正后的完整代码
下面是调整后的代码,重点统一了月份格式,并确保生成的空框架(shell)覆盖所有目标月份和唯一账户:
# 1. 生成目标时间范围内的所有月份,格式转为与原数据一致的YYYYMM start_date <- as.Date("2015-01-01") end_date <- as.Date("2019-06-01") months_seq <- seq(start_date, end_date, by = "1 month") months_formatted <- format(months_seq, "%Y%m") # 转换为"201501"这类格式 # 2. 获取所有唯一账户,生成账户+月份的笛卡尔积框架 unique_accounts <- unique(df$account_id) # 避免重复账户多次生成 shell <- expand.grid( Account_id = unique_accounts, Month = months_formatted, stringsAsFactors = FALSE ) # 3. 预处理原数据,确保月份格式与shell一致 data <- data.frame( Account_id = df$account_id, Month = as.character(df$partition_ledger_year_month), # 转字符匹配shell格式 balance = df$amount_usd, stringsAsFactors = FALSE ) # 4. 合并数据并填充缺失值为0 df2 <- merge(shell, data, by = c("Account_id", "Month"), all.x = TRUE) df2$balance[is.na(df2$balance)] <- 0
关键调整说明
- 统一月份格式:将生成的月份序列转为
YYYYMM字符格式,和原数据的Month字段完全匹配,确保merge时能正确关联已有记录。 - 使用唯一账户:用
unique(df$account_id)获取不重复的账户列表,避免同一账户在shell中重复生成多条相同月份记录。 - 简化缺失值填充:直接用
df2$balance[is.na(df2$balance)] <- 0替换缺失值,比which()写法更简洁高效。
验证结果
运行后,每个账户都会包含2015-01到2019-06的全部54条记录:已有数据的月份保留原余额,缺失月份自动补0,完全符合你期望的输出格式。
内容的提问来源于stack exchange,提问作者A.B.
相关产品推荐
相关产品推荐

