Muitas vezes tenho um código que se parece com
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, ... } )
Então, estou testando:
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()
é muito bom, cerca de 8 vezes mais rápido que do.call("rbind")
. ainda assim, ainda estou me perguntando se há uma maneira de escrever uma versão especializada mais rápida que simplify2array()
se baseie no fato de que os resultados são NULL ou todos no mesmo quadro de dados. presumivelmente não, mas pensei em perguntar.
Você pode tentar
unlist() |> array() |> t()
remover possíveis overheads (veja lapply2 abaixo) ou ouunlist() |> matrix(byrow=TRUE)
para evitar transposição (veja lapply3 ). No entanto, em vez deby()
você pode usarsplit() |> lapply() |> simplify2array() |> t()
orsplit() |> sapply() |> t()
, já quesapply()
é comolapply()
com integradosimplify2array()
, orvapply()
:Referência
Depende exatamente do que você faz
*apply()
e se a troca é benéfica para escrever código personalizado.Código