【发布时间】:2017-08-10 13:05:04
【问题描述】:
我正在尝试在 R 中为 nrow=300,000 次模拟(在 ncol=30 个变量上)执行以下操作:
投反对票
接受
这是我的代码:
FS_DF <- read.csv("fs.csv", sep = ",")
Y_DF <- read.csv("Y.csv", sep = ",")
CALIBSCENS_DF <- read.csv("calib_scens.csv", sep = ",")
Y_DF$X <- NULL
X_mat <- matrix(1:1, nrow(CALIBSCENS_DF), nrow(FS_DF))
for (irow in 1:nrow(CALIBSCENS_DF)) {
for (jrow in 1:nrow(FS_DF)) {
for (krow in 1:ncol(FS_DF)) {
X_mat [irow, jrow] <- X_mat[irow, jrow] * (CALIBSCENS_DF[irow, krow] ^ FS_DF[jrow, krow])
}}}
fit <- .lm.fit(X_mat, as.matrix(sapply(Y_DF, as.numeric)))
填充我的 X 矩阵需要很长时间。有人可以建议一种更快的方法来执行此操作。 SCENS_DF、FS_DF 是数据帧。 X_mat 是一个矩阵。
【问题讨论】:
-
看起来
X_mat * (CALIBSCENS_DF ^ FS_DF)应该可以工作,因为这些是元素操作。 -
循环在 R 中非常慢。最好使用其中一个应用函数(它在内部也使用循环,但在 C 中实现)。这些函数的一个很好的介绍可以在这个答案中找到:stackoverflow.com/questions/4162363/… 此外,您的代码很慢,因为矩阵的大小没有预定义,这在 R 中也很慢。创建一个预期尺寸的空矩阵,稍后填充它们。
-
感谢 Imo 和 JereB。我确实将 X_mat 预定义为 X_mat
-
@JereB 不完全正确。见The R Inferno。
-
@Rishi,不,我认为你的代码可以写得更好。我试图弄清楚你的代码在做什么。一个可重现的例子真的很有帮助。
CALIBCENS_DF、X_mat和FS_DF都具有相同的尺寸吗?
标签: r performance loops apply