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