Update
不知道你想做什么,我将分享另一个建议:为每一列预分配你想要的类型的向量,将值插入到这些向量中,然后最后创建你的data.frame
.
继续朱利安的f3
(预先分配的data.frame
)作为迄今为止最快的选项,定义为:
# pre-allocate space
f3 <- function(n){
df <- data.frame(x = numeric(n), y = character(n), stringsAsFactors = FALSE)
for(i in 1:n){
df$x[i] <- i
df$y[i] <- toString(i)
}
df
}
这是一种类似的方法,但其中data.frame
作为最后一步创建。
# Use preallocated vectors
f4 <- function(n) {
x <- numeric(n)
y <- character(n)
for (i in 1:n) {
x[i] <- i
y[i] <- i
}
data.frame(x, y, stringsAsFactors=FALSE)
}
microbenchmark
“microbenchmark”包将为我们提供比system.time
:
library(microbenchmark)
microbenchmark(f1(1000), f3(1000), f4(1000), times = 5)
# Unit: milliseconds
# expr min lq median uq max neval
# f1(1000) 1024.539618 1029.693877 1045.972666 1055.25931 1112.769176 5
# f3(1000) 149.417636 150.529011 150.827393 151.02230 160.637845 5
# f4(1000) 7.872647 7.892395 7.901151 7.95077 8.049581 5
f1()
(下面的方法)效率非常低,因为它调用的频率很高data.frame
而且因为在 R 中以这种方式生长对象通常很慢。f3()
由于预分配,性能得到很大改善,但是data.frame
结构本身可能是这里瓶颈的一部分。f4()
尝试绕过该瓶颈而不影响您想要采取的方法。
原答案
这确实不是一个好主意,但如果你想这样做,我想你可以尝试:
for (i in 1:10) {
df <- rbind(df, data.frame(x = i, y = toString(i)))
}
请注意,在您的代码中,还存在另一个问题:
- 你应该使用
stringsAsFactors
如果您希望字符不转换为因子。使用:df = data.frame(x = numeric(), y = character(), stringsAsFactors = FALSE)