在R中,如何用列均值替换缺失值?

时间:2014-01-16 16:41:28

标签: r missing-data

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用上面的Tyler数据

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