使用R中的均值估算缺失值的功能

时间:2018-11-29 13:35:18

标签: r function for-loop

我的小标题:

Excel中的数据:

Data in Excel

impute <- read_excel(choose.files())

imp <- function(df) {
      for(i in 1:ncol(df)){
        df[is.na(df[,i]),i] <- mean(df[,i],na.rm = T)
      }
}


imp(impute)
  

警告消息:
  1:在mean.default(df[, i], na.rm = T)中:
   参数不是数字或逻辑:返回NA
  2:在mean.default(df[, i], na.rm = T)中:
   参数不是数字或逻辑:返回NA

上面的代码在插补到Data.Frame的情况下可以正常工作,但如果是Tibble,则无法工作。如果我要使用Tibble,有人可以让我知道如何更改代码。

1 个答案:

答案 0 :(得分:1)

data.frame和小标题之间的区别之一是,默认情况下,数据帧会降低尺寸,而小标题则不会。

也就是说,如果x是数据帧,则x[, i]可能是也可能不是数据帧,具体取决于i。如果i是一个值,则x[, i]将只是一个向量。如果i是具有多个值的向量,则x[, i]将是一个数据帧。当i是一个可能具有多个值或可能没有多个值的变量时,这可能会导致错误,因为类可能有所不同(修复方法是使用x[, i, drop = FALSE]以保证返回data.frame

小标题试图通过将默认的drop = TRUE切换为drop = FALSE来解决此问题,因此x[, i]是小标题,而不管i的长度是1还是更长。

在计算平均值时,您希望将df[,i]视为数字矢量,而不是包含1列的小标题,因此需要指定它:

df[[i]] # This is the preferred way to extract a single column
df[, i, drop = TRUE] # this will work too (since tibble version 1.4.1)

Tibbles vignette的“标题与数据框架”部分对此进行了详细说明。