如何按各因子水平求和?缺失因子水平补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
相关产品推荐
相关产品推荐

