【问题标题】:In R how do I replace the missing values with the column mean? [closed]在 R 中,如何用列均值替换缺失值? [关闭]
【发布时间】:2014-01-16 16:41:28
【问题描述】:

我缺少要替换为列均值的数据。如果有人可以提供有关如何使用 R 执行此操作的命令。该主题已显示在站点上,但说明不够通用,我无法完成该命令。任何帮助将不胜感激。

【问题讨论】:

  • 您好,欢迎来到 SO。您的缺失数据如何表示?作为NA,作为"",?为了帮助制作可重现的示例,您可以使用 reproduce(<your data>) 。说明在这里:bit.ly/SORepro - How to make a great R reproducible example
  • 您的问题缺少无法回答的信息。请按照@RicardoSaporta 提供的链接中的说明进行操作。
  • 用列的平均值替换缺失值通常被认为是一个真的坏主意。如果您继续对数据进行任何建模,您获得的标准误差将因此人为地变小。
  • @user3203431 然后不要上传阅读的东西。制作您自己的最小样本。事实上,粘贴大型真实数据集通常不是一个好主意,因为它会使事情变得不必要地复杂化。所以类似:x <- data.frame(matrix(rnorm(30), ncol=3)); x[c(4, 9), c(1, 2, 3)] <- NA; x 会产生一个最低限度的工作示例。
  • 泰勒对this question 的回答有帮助吗?

标签: r missing-data


【解决方案1】:

由于您的问题中没有太多细节,这就是我想象的可能是您的问题。 如果恰好是宽格式,请使用require(reshape2); melt(yourdata) 将您的数据转换为long format。 编辑:添加了一个宽而长的格式示例。在宽格式的情况下,我缺乏一种 ddply 方法来解决这个问题。请编辑添加。

require(data.table)
require(plyr)

长格式

set.seed(123)
df <- data.frame(group = sample(c(letters[1:5]), 10e5, replace=T),
                 q_var = sample(c(rpois(10, 50), NA), 10e5, replace = T))
DT <- data.table(df)

impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

# Impute by group
imp1 <- ddply(df, ~ group, transform, q_var = impute.mean(q_var))

table(df$group)
length(df$group)

imp2 <- DT[, lapply(.SD, impute.mean), by = "group"]
table(DT$group)
length(DT$group)

require(rbenchmark)

imp_ddply <- function(x){
  ddply(df, ~ group, transform, q_var = impute.mean(q_var))
}

imp_DT <- function(x){
  DT[, lapply(.SD, impute.mean), by = "group"]
}

benchmark(imp_ddply(df), imp_DT(DT))
#          test replications elapsed relative user.self sys.self 
# imp_ddply(df)          100  156.47   13.419    149.94     6.35 
#    imp_DT(DT)          100   11.66    1.000     11.61     0.04

宽幅

require(reshape2)

wdf <- data.frame(matrix(sample(c(rpois(10, 50), NA), 900000, replace = T), ncol=3))
WDT <- data.table(wdf)

wide_imp1 <- apply(wdf, 2, impute.mean)
wide_imp2 <- WDT[, lapply(.SD, impute.mean)]

wide_apply <- function(x) apply(wdf, 2, impute.mean)
wide_DT <- function(x) WDT[, lapply(.SD, impute.mean)]

benchmark(wide_apply(wdf), wide_DT(WDT))
#             test replications elapsed relative user.self sys.self
#  wide_apply(wdf)          100    7.84    1.413      7.84        0
#     wide_DT(WDT)          100    5.55    1.000      5.55        0

【讨论】:

    【解决方案2】:

    从上面使用 Tyler 的数据

    x[is.na(x$X1) == "TRUE", 1] <- mean(x$X1, na.rm = T)
    

    【讨论】:

    • 其他列呢?
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2018-02-05
    • 1970-01-01
    • 2023-01-13
    • 2019-09-29
    • 2019-08-15
    • 2012-05-03
    相关资源
    最近更新 更多