使用平均值替换Hitters数据集Salary列NA值时出现数据行数异常
问题解决:Hitters数据集Salary列NA填充后仅保留一行数据
错误根源
你的代码中这一行导致了问题:
hitters_num <- Hitters[, sapply(Hitters, is.numeric)][1, ]
末尾的[1, ]强制提取了数据框的第一行,后续所有填充操作都只针对这一行执行,最终结果自然只有一行数据。
修正方案
方案1:保留原逻辑,修正行提取错误
移除[1, ],保留所有行的数值型列:
# 提取所有行的数值型列 hitters_num <- Hitters[, sapply(Hitters, is.numeric)] hitters_num_imputed <- hitters_num # 计算各列均值(忽略NA) col_means <- colMeans(hitters_num, na.rm = TRUE) # 循环填充每列的NA值 for (i in 1:ncol(hitters_num)) { col <- hitters_num[, i] col[is.na(col)] <- col_means[i] hitters_num_imputed[, i] <- col } # 查看填充后的结果 summary(hitters_num_imputed)
方案2:仅处理Salary列(更高效)
既然你的需求只是填充Salary列的NA值,没必要处理所有数值型列,直接针对目标列操作:
# 直接将Salary列的NA替换为该列均值 Hitters$Salary[is.na(Hitters$Salary)] <- mean(Hitters$Salary, na.rm = TRUE) # 验证结果 summary(Hitters$Salary)
方案3:用apply简化代码
如果需要批量处理所有数值列的NA,用apply可以替代循环,代码更简洁:
hitters_num <- Hitters[, sapply(Hitters, is.numeric)] hitters_num_imputed <- as.data.frame(apply(hitters_num, 2, function(x) { x[is.na(x)] <- mean(x, na.rm = TRUE) return(x) })) summary(hitters_num_imputed)
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

