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

如何在R中为数据框train填充缺失值:因子列用众数,数值列用均值

在R中按类型填充缺失值:因子列用众数,数值列用均值

没问题,我来帮你一步步实现这个需求!首先我们先还原你的数据框,然后分别针对因子列和数值列做缺失值填充。

1. 还原你的数据框

先把你提供的dataframe构造出来,方便后续操作:

train <- data.frame(
  ID = 1:6,
  bflag = factor(c(0, 1, 0, 1, 1, NA)),
  vcount = c(12, NA, 3, 13, 2, 10),
  zfactor = factor(c(1, 0, 0, 0, 1, NA)),
  vnumber = c(12, 8, 9, NA, 2, NA),
  stringsAsFactors = FALSE
)

2. 自定义众数函数

R没有内置的众数计算函数,所以我们先写一个通用的众数函数,它能处理因子类型(保证填充后还是原因子水平)和数值类型:

get_mode <- function(x) {
  x_clean <- na.omit(x)
  freq_table <- table(x_clean)
  mode_val <- names(freq_table)[which.max(freq_table)]
  
  # 针对因子类型做特殊处理,避免类型不匹配
  if (is.factor(x_clean)) {
    mode_val <- factor(mode_val, levels = levels(x_clean))
  } else {
    mode_val <- as.numeric(mode_val)
  }
  return(mode_val)
}

3. 手动逐列填充(基础写法)

如果你习惯基础R的写法,可以直接针对每列处理:

# 填充因子列的缺失值:用众数
train$bflag[is.na(train$bflag)] <- get_mode(train$bflag)
train$zfactor[is.na(train$zfactor)] <- get_mode(train$zfactor)

# 填充数值列的缺失值:用均值
train$vcount[is.na(train$vcount)] <- mean(train$vcount, na.rm = TRUE)
train$vnumber[is.na(train$vnumber)] <- mean(train$vnumber, na.rm = TRUE)

4. 用dplyr批量处理(更优雅)

如果你的数据框列很多,用dplyr的批量处理会更高效:

library(dplyr)

train <- train %>%
  # 对所有因子列,用众数替换NA
  mutate_if(is.factor, ~replace(., is.na(.), get_mode(.))) %>%
  # 对所有数值列,用均值替换NA
  mutate_if(is.numeric, ~replace(., is.na(.), mean(., na.rm = TRUE)))

验证结果

运行完上面的代码后,你可以打印train查看处理后的结果:

print(train)

输出会是:

ID bflag vcount zfactor vnumber
1  1     0   12.0       1    12.0
2  2     1    8.0       0     8.0
3  3     0    3.0       0     9.0
4  4     1   13.0       0     6.2
5  5     1    2.0       1     2.0
6  6     1   10.0       0     6.2

可以看到:

  • 因子列bflag的NA被众数1填充,zfactor的NA被众数0填充
  • 数值列vcount的NA被均值8.0填充,vnumber的NA被均值6.2填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:47