您好我有一个包含4列(全数字)的数据集,我正在用列的平均值替换缺失值。下面的代码既没有给出错误也没有替换值。
mi <- function(x){
for( col in 1:ncol(x)){
for( row in 1:nrow(x)){
ifelse(is.na(x[row, col]), x[row,col] <- mean(x[, col], na.rm = TRUE), x[row, col])
}
}
}
请建议..
答案 0 :(得分:1)
这是一种非常简单的方法(具有一些可重复的样本数据):
一些示例数据:
set.seed(1)
df <- data.frame(matrix(sample(c(NA, 1:10), 100, TRUE), ncol = 4))
head(df)
# X1 X2 X3 X4
# 1 2 4 5 9
# 2 4 NA 9 9
# 3 6 4 4 4
# 4 9 9 2 8
# 5 2 3 NA 10
# 6 9 5 1 4
让我们制作一份副本并用列方式替换NA
。
df2 <- df
df2[] <- lapply(df2, function(x) { x[is.na(x)] <- mean(x, na.rm=TRUE); x })
head(df2)
# X1 X2 X3 X4
# 1 2 4.000000 5 9
# 2 4 5.956522 9 9
# 3 6 4.000000 4 4
# 4 9 9.000000 2 8
# 5 2 3.000000 5 10
# 6 9 5.000000 1 4
验证是否插入了正确的值。将df2[2, 2]
与以下内容进行比较:
mean(df$X2, na.rm = TRUE)
# [1] 5.956522
答案 1 :(得分:0)
参数x
是原件的副本。您需要返回修改后的值:
mi <- function(x){
for( col in 1:ncol(x)){
for( row in 1:nrow(x)){
ifelse(is.na(x[row, col]), x[row,col] <- mean(x[, col], na.rm = TRUE), x[row, col])
}
}
return(x)
}
答案 2 :(得分:0)
或者像这样:
x <- matrix(sample(c(NA,1:10),100,TRUE),nrow=10)
x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 7 7 1 6 7 3 10 4 NA 2
[2,] 3 2 7 9 1 4 2 5 10 1
[3,] 10 4 2 8 7 4 1 8 8 3
[4,] 7 7 6 9 2 6 NA 6 6 10
[5,] 1 NA 5 9 9 4 NA 5 8 2
[6,] 4 4 9 3 9 4 5 NA 5 1
[7,] NA 2 2 2 9 2 10 NA 8 7
[8,] 10 8 7 1 5 2 9 7 10 5
[9,] 6 3 10 9 8 6 7 10 3 10
[10,] 7 9 5 2 2 9 5 6 NA 9
means <- colMeans(x,na.rm=TRUE)
for(i in 1:ncol(x)){
x[is.na(x[,i]),i] <- means[i]
}
x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 7.000000 7.000000 1 6 7 3 10.000 4.000 7.25 2
[2,] 3.000000 2.000000 7 9 1 4 2.000 5.000 10.00 1
[3,] 10.000000 4.000000 2 8 7 4 1.000 8.000 8.00 3
[4,] 7.000000 7.000000 6 9 2 6 6.125 6.000 6.00 10
[5,] 1.000000 5.111111 5 9 9 4 6.125 5.000 8.00 2
[6,] 4.000000 4.000000 9 3 9 4 5.000 6.375 5.00 1
[7,] 6.111111 2.000000 2 2 9 2 10.000 6.375 8.00 7
[8,] 10.000000 8.000000 7 1 5 2 9.000 7.000 10.00 5
[9,] 6.000000 3.000000 10 9 8 6 7.000 10.000 3.00 10
[10,] 7.000000 9.000000 5 2 2 9 5.000 6.000 7.25 9
这不完全是您正在寻找的但可能有用。此函数用中位数(在每列中)替换所有NA:
require(randomForest)
x <- matrix(sample(c(NA,1:10),100,TRUE),nrow=10)
na.roughfix(x)