You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按各因子水平求和?缺失因子水平补0的实现方案

解决cast函数丢失因子水平的问题

看起来你遇到的问题是cast默认会忽略那些没有对应数据的因子水平,导致d这个水平没出现在结果里。别担心,我们可以通过两种方法解决,要么补全数据后再用cast,要么用更现代的tidyverse工具来实现,后者通常更直观灵活。

方法1:用tidyverse(推荐)

现在R社区更常用dplyr+tidyr的组合来处理这类数据重塑问题,代码可读性更高,也更容易保留所有因子水平:

# 先加载需要的包
library(dplyr)
library(tidyr)

# 处理数据:确保ATYPE保留所有原始因子水平,补全所有组合后再重塑
result <- df_Temp %>%
  # 强制保留ATYPE的所有原始因子水平(避免自动丢失未出现的水平)
  mutate(ATYPE = factor(ATYPE, levels = levels(df_Temp$ATYPE))) %>%
  # 生成ATYPE和AFTER_ADM的所有可能组合,缺失的CHRGES填充为0
  complete(ATYPE, AFTER_ADM, fill = list(CHRGES = 0)) %>%
  # 按分组求和
  group_by(ATYPE, AFTER_ADM) %>%
  summarise(CHRGES = sum(CHRGES), .groups = "drop") %>%
  # 转换为你需要的宽格式
  pivot_wider(names_from = AFTER_ADM, values_from = CHRGES)

# 如果需要把"Unknown"改成"e",可以在mutate里加一句:
# mutate(ATYPE = fct_recode(ATYPE, "e" = "Unknown"))

运行这段代码后,你会得到包含所有5个ATYPE水平的结果,没有数据的求和值自动显示为0。

方法2:补全数据后用reshape包的cast

如果你坚持使用reshape包的cast函数,需要先手动补全所有ATYPE和AFTER_ADM的组合,确保没有遗漏的水平:

library(reshape)

# 生成所有可能的ATYPE和AFTER_ADM组合
all_combos <- expand.grid(
  ATYPE = levels(df_Temp$ATYPE),
  AFTER_ADM = unique(df_Temp$AFTER_ADM),
  stringsAsFactors = TRUE
)

# 合并原数据和全组合,缺失的CHRGES填充为0
df_full <- merge(all_combos, df_Temp, by = c("ATYPE", "AFTER_ADM"), all.x = TRUE)
df_full$CHRGES[is.na(df_full$CHRGES)] <- 0

# 再用cast求和
result <- cast(df_full, ATYPE~AFTER_ADM, sum, value = "CHRGES")

为什么原来的cast会丢失d?

cast函数默认参数drop=TRUE,会自动丢弃那些在数据中没有对应观测的因子水平组合。d这个水平在你的原始df_Temp里可能没有和任何AFTER_ADM值配对的行,所以被自动过滤掉了。补全所有组合后再求和,就能确保所有水平都被保留。

内容的提问来源于stack exchange,提问作者Rags

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:57:29