Relleno de celda de matriz i, j más rápido

Quiero tomar columnas de un data.frame / matrix y aplicar una función entre cada celda ([i, j]) del marco de datos donde i y j son las secuencias a lo largo de las columnas del marco de datos. Básicamente quiero llenar una matriz de celdas individuales de la misma manera que elcor La función funciona con un data.frame.

Esta es una pregunta relacionada:Crear una matriz a partir de una función y dos marcos de datos numéricos. Sin embargo, uso esto en pruebas de aleatorización y repito la operación muchas veces (hacer muchas matrices). Estoy buscando la forma más rápida de hacer esta operación. He acelerado un poco las cosas usando el procesamiento en paralelo, pero todavía no estoy contento con esta velocidad. No se puede suponer que la salida de la matriz es simétrica tampoco, eso es en el caminocor produce una matriz simétrica (mi ejemplo reflejará esto).

Vi en la página web data.table hoy (http://datatable.r-forge.r-project.org/) el seguimiento:

500 veces más rápido queDF[i,j]<-value

Esto me hizo pensar que tal vezdata.table odplyr u otros medios pueden acelerar un poco las cosas. Mi cerebro ha sido reparado en las células de llenado, pero tal vez hay una mejor manera de remodelar, aplicar la función y remodelar a una matriz o algo por el estilo. Puedo lograr esto en base R usandoouter o unfor bucle de la siguiente manera.

## 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

Aquí están losmicrobenchmark tiempos confor obteniendo una ligera ventaja.

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

¿Cuál es el enfoque más rápido para esto en R (agregar paquetes bienvenidos)?

Respuestas a la pregunta(1)

Su respuesta a la pregunta