【问题标题】:Function to impute missing values using mean in R使用 R 中的平均值估算缺失值的函数
【发布时间】:2018-11-29 13:35:18
【问题描述】:

我的小标题:

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,有人可以告诉我如何更改代码。

【问题讨论】:

  • 请将str(yourDataframe)的结果复制到问题中。我想有一个因素列。顺便说一句:你的函数什么都不返回。
  • 欢迎来到 SO。除非主题是图像处理,否则图像既不是代码也不是数据。请点击您问题下方的“r”,然后点击“信息”并查看有关如何在 R 标签中提问的指南。

标签: r function for-loop


【解决方案1】:

data.frame 和 tibble 之间的区别之一是,默认情况下数据框会尽可能地丢弃尺寸,而 tibble 不会。

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

Tibbles 试图通过将默认 drop = TRUE 切换为 drop = FALSE 来解决此问题,因此 x[, i] 是一个 tibble,无论 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 的“Tibbles 与 data.frames”部分对此进行了更详细的说明。

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多