【发布时间】:2013-05-22 14:52:08
【问题描述】:
我有一个数据框:
id <- c(rep(1, 4), rep(2, 3), rep(3, 2), 4)
rate <- c(rep(1, 3), NA, 0.5, 0.6, NA, 0.7, NA, NA)
df <- data.frame(id, rate)
我需要根据以下条件替换NA:
for (i in 1:dim(df)[1]) {
if (is.na(df$rate[i])) {
mrate <- round(mean(df$rate[df$id == df$id[i]], na.rm = T), 1)
if (is.nan(mrate)) {
df$rate[i] <- 1
} else {
df$rate[i] <- mrate
}
}
}
显然,for 循环在超过 200K 行的大数据帧上太慢了。如何在不使用for 循环的情况下使用更快的方式?
谢谢!
【问题讨论】:
-
fwiw,
for循环并不慢。相反,我的猜测是代码中最慢的部分是确定mean时执行的子集操作。如果您使用aggregate或其他方法预先计算每个组的平均值,您的循环将明显更快......但data.table解决方案几乎肯定会更清洁和更快!
标签: r