Preenchimento mais rápido das células da matriz i, j

Quero pegar colunas de um data.frame / matrix e aplicar uma função entre cada célula ([i, j]) do quadro de dados em que iej são as seqüências ao longo das colunas do quadro de dados. Basicamente, quero preencher uma matriz de células individuais da mesma maneira que ocor A função funciona com um data.frame.

Esta é uma pergunta relacionada:Criar uma matriz a partir de uma função e dois quadros de dados numéricos No entanto, eu uso isso em testes de randomização e repito a operação várias vezes (faça muitas matrizes). Estou procurando a maneira mais rápida de fazer essa operação. Acelerei um pouco as coisas usando o processamento paralelo, mas ainda não estou feliz com essa velocidade. Também não se pode supor que a saída da matriz seja simétrica, o que está no caminhocor produz uma matriz simétrica (meu exemplo refletirá isso).

Eu vi na página da web data.table hoje (http://datatable.r-forge.r-project.org/) Os seguintes:

500+ vezes mais rápido queDF[i,j]<-value

Isso me fez pensar que talvezdata.table oudplyr ou outros meios podem acelerar um pouco as coisas. Meu cérebro está fixo no preenchimento de células, mas talvez exista uma maneira melhor de remodelar, aplicar a função e remodelar a uma matriz ou algo nesse sentido. Eu posso conseguir isso na base R usandoouter ou umfor loop da seguinte maneira.

## Arbitrary function
FUN <- function(x, y) round(sqrt(sum(x)) - sum(y), digits=1)

## outer approach
outer(
  names(mtcars), 
  names(mtcars), 
  Vectorize(function(i,j) FUN(mtcars[,i],mtcars[,j]))
)

## for approach
mat <- matrix(rep(NA, ncol(mtcars)^2), ncol(mtcars))
for (i in 1:ncol(mtcars)) {
    for (j in 1:ncol(mtcars)) {
        mat[i, j] <- FUN(mtcars[, i], mtcars[, j])
    }
}
mat

Aqui está omicrobenchmark horários comfor obtendo uma ligeira vantagem.

Unit: milliseconds
    expr      min       lq   median       uq      max neval
 OUTER() 4.450410 4.691124 4.774394 4.877724 55.77333  1000
   FOR() 4.309527 4.521785 4.588728 4.694156  7.04275  1000

Qual é a abordagem mais rápida para isso no R (adicione pacotes bem-vindos)?

questionAnswers(1)

yourAnswerToTheQuestion