R语言使用中位数填充dataframe所有数值列NA值的实现问题
现有代码问题修正与替换方法
你当前写的函数存在核心逻辑漏洞:你单独提取了数值列做空值填充,但没有把处理完成的数值列写回原数据框,最后直接返回了未修改的原输入数据,所以哪怕调用函数也不会生效。
先修正函数逻辑:
median_forNumericalNulls <- function(dataframe){ # 筛选所有数值列 nums <- unlist(lapply(dataframe, is.numeric)) # 直接修改原数据框的数值列 dataframe[, nums] <- lapply(dataframe[, nums], function(x) { x[is.na(x)] <- median(x, na.rm = TRUE) x }) return(dataframe) }
修正后直接赋值就能替换A的内容:
A <- median_forNumericalNulls(A)
更优的实现方式
方案1:base R极简写法(无需自定义函数)
如果不需要复用填充逻辑,一行代码就能实现需求:
A[sapply(A, is.numeric)] <- lapply(A[sapply(A, is.numeric)], function(x) replace(x, is.na(x), median(x, na.rm = TRUE)))
方案2:tidyverse语法(可读性更高,适配分析流程)
用dplyr的across语法表意更直接,也能和其他数据处理步骤无缝衔接:
library(dplyr) A <- A %>% mutate(across(where(is.numeric), ~replace(., is.na(.), median(., na.rm = TRUE))))
这种写法后续要调整填充规则(比如改成均值、分位数填充),只要替换median部分的代码即可,维护成本更低。
内容的提问来源于stack exchange,提问作者user3789200
相关产品推荐
相关产品推荐

