我经常有这样的代码
rbind.oc.by <- function (indata, INDICES, FUN, ...) {
result <- by( indataframe, INDICES, FUNIN, ... )
t(simplify2array(result))
}
mynewdata <- rbind.oc.by( dataframe, dataframe$variable, function(dd) { with(dd, ... } )
因此,我正在测试它:
set.seed(0)
if (!exists("X")) {
X <- lapply( 1:10000000, function(i) {
c(a=rnorm(1), b=rnorm(1), x="A", y= as.logical(rnorm(1)))
})
}
## R CMD Rprof testprof.out
Rprof("testprof.out")
intimealloc <- function() {
as.data.frame(do.call("rbind", X))
}
v1 <- intimealloc()
firstalloc <- function() {
simplify2array( t( X ))
}
v2 <- firstalloc()
Rprof(NULL)
simplify2array()
非常好,比快大约 8 倍do.call("rbind")
。但是,我仍然想知道是否有办法编写一个更快的专门版本,simplify2array()
该版本依赖于结果为 NULL 或所有相同的数据框这一事实。大概没有,但我想我会问。
您可以尝试
unlist() |> array() |> t()
消除可能的开销(请参阅下面的lapply2)或或unlist() |> matrix(byrow=TRUE)
避免转置(请参阅lapply3by()
)。但是,您可以使用split() |> lapply() |> simplify2array() |> t()
或来代替split() |> sapply() |> t()
,因为与集成的或sapply()
类似:lapply()
simplify2array()
vapply()
基准
这只取决于您具体做什么
*apply()
以及权衡是否有利于编写自定义代码。代码