由于您的问题中没有太多细节,这就是我想象的可能是您的问题。
如果恰好是宽格式,请使用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