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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:05:01