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