如何用各列中位数替换数据框NA值?R代码报错排查与解决
问题分析与代码修正
你的代码出现报错 Error in [.default(df1, col) : invalid subscript type 'closure' 主要有两个原因:
- 错误调用median函数:
median[col]写法错误,median是R中的函数(属于closure类型),不能用方括号索引。需针对当前列计算中位数,正确写法为median(x, na.rm = TRUE)。 - NA值判断逻辑错误:
x %in% is.na(df1)逻辑混乱,is.na(df1)返回整个数据框的NA判断矩阵,而你需要的是当前列x中的NA值,正确写法是is.na(x)。
修正后的完整代码
id <- c(1,2,3,4,5,6,7,8,9,10) varA <- c(15,10,8,19,7,5,NA,11,12,NA) varB <- c(NA,1,2,3,4,3,3,2,1,NA) df <- data.frame(id, varA,varB) df1 <- df # 需要替换NA的列 col <- c("varA", "varB") # 遍历目标列,用列中位数替换NA df1[col] <- sapply(df1[col], function(x) { # 计算当前列的中位数(忽略NA) col_median <- median(x, na.rm = TRUE) # 替换当前列中的NA值为中位数 replace(x, is.na(x), col_median) }) df1
运行结果
修正后代码运行输出:
id varA varB 1 1 15.00 2.5 2 2 10.00 1.0 3 3 8.00 2.0 4 4 19.00 3.0 5 5 7.00 4.0 6 6 5.00 3.0 7 7 10.50 3.0 8 8 11.00 2.0 9 9 12.00 1.0 10 10 10.50 2.5
内容的提问来源于stack exchange,提问作者Rodrigo Zambon
相关产品推荐
相关产品推荐

