这里有几种方法和它们的时间。
createDF1 <- function(colVec, data)
{
m <- matrix(, nrow = nrow(data), ncol = length(colVec),
dimnames = list(NULL, colVec))
m[, names(data)] <- as.matrix(data)
data.frame(apply(m, 2, as.numeric))
}
createDF2 <- function(colVec, data)
{
rr <- setNames(rep(list(rep(NA_integer_, nrow(data))), length(colVec)), .
nm = colVec)
rr[match(names(data), colVec)] <- data
as.data.frame(rr)
}
createDF3 <- function(colVec, data)
{
rr <- setNames(replicate(length(colVec),
list(rep(NA_integer_, nrow(data)))),
nm = colVec)
rr[match(names(d), colVec)] <- data
as.data.frame(rr)
}
创建一个 3,000,000 x 3 的数据框以进行测试:
columns <- letters[1:21]
d <- data.frame(g = 1:3e6L, s = 1:3e6L, j = 1:3e6L)
运行一些测试:
system.time({ createDF1(columns, d) })
system.time({ createDF2(columns, d) })
system.time({ createDF3(columns, d) })
在这三个选项中,看起来
rep(list(rep(NA_integer_, nrow(data))), length(columns))
是最好的选择,并从中替换值。
[
括号来创建向量。 - Thomas