替换工具R中数据集中的缺失值

时间:2014-04-19 09:06:52

标签: r dataframe missing-data na

您好我有一个包含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])
    }
  }
}

请建议..

3 个答案:

答案 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)