使现代化
不知道你想做什么,我再分享一个建议:为每列预先分配你想要的类型的向量,在这些向量中插入值,然后在最后创建你的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
struct 本身可能是这里的瓶颈之一.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)