如何在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
相关产品推荐
相关产品推荐

