如何在R数据框中补全缺失类别并显示对应0值
补全R数据框中缺失的类别行并填充默认值
原始数据
df <- data.frame(Grade = c(1,1,2,2,2), Var = c("Gender","Gender","Gender","Gender","Gender"), Cat = c("No","Not Specified", "No","Yes","Not Specified"), n = c(10,15,20,40,40), Percentage = c(.40,.60,.2,.4,.4))
需求:为Grade = 1补全缺失的Cat = "Yes"类别,对应的n和Percentage设为0,得到完整的类别行。
方法一:使用tidyverse工具链(dplyr + tidyr)
代码简洁直观,适合常规数据处理场景:
library(tidyverse) df_complete <- df %>% # 按年级和变量分组,确保每个分组覆盖所有类别 group_by(Grade, Var) %>% # 生成当前分组下所有Cat类别的完整组合,缺失行自动创建 complete(Cat = unique(df$Cat)) %>% # 将缺失的n和Percentage值替换为0 mutate(across(c(n, Percentage), ~replace_na(.x, 0))) %>% ungroup() %>% # 按年级和类别排序,匹配目标格式 arrange(Grade, Cat) # 查看结果 df_complete
输出结果:
# A tibble: 6 × 5 Grade Var Cat n Percentage <dbl> <chr> <chr> <dbl> <dbl> 1 1 Gender No 10 0.4 2 1 Gender Yes 0 0 3 1 Gender Not Specified 15 0.6 4 2 Gender No 20 0.2 5 2 Gender Yes 40 0.4 6 2 Gender Not Specified 40 0.4
方法二:使用Base R(无需额外包)
如果不想加载第三方包,可用原生R函数实现:
# 获取所有Cat类别全集 all_cats <- unique(df$Cat) # 生成所有Grade、Var、Cat的完整组合 full_combinations <- expand.grid( Grade = unique(df$Grade), Var = unique(df$Var), Cat = all_cats, stringsAsFactors = FALSE ) # 合并原始数据与全组合,保留所有全组合行 df_complete_base <- merge(full_combinations, df, by = c("Grade", "Var", "Cat"), all.x = TRUE) # 将缺失值替换为0 df_complete_base[is.na(df_complete_base$n), c("n", "Percentage")] <- 0 # 排序并重置行名 df_complete_base <- df_complete_base[order(df_complete_base$Grade, df_complete_base$Cat), ] row.names(df_complete_base) <- NULL # 查看结果 df_complete_base
输出结果与方法一完全一致。
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

