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)?