Быстрее заполнить ячейку матрицы i, j

Я хочу взять столбцы data.frame / matrix и применить функцию к каждой ячейке ([i, j]) фрейма данных, где i и j - последовательности вдоль столбцов фрейма данных. В основном я хочу заполнить матрицу отдельных ячеек так же, какcor функция работает с data.frame.

Это связанный вопрос:Создать матрицу из функции и двух числовых фреймов данных Однако я использую это в рандомизированных тестах и ​​повторяю операцию много раз (делаю много матриц). Я ищу самый быстрый способ сделать эту операцию. Я немного ускорил процесс, используя параллельную обработку, но я все еще не доволен этой скоростью. Нельзя предполагать, что матричный вывод также является симметричным, то естьcor производит симметричную матрицу (мой пример будет отражать это).

Я видел на веб-странице data.table сегодня (http://datatable.r-forge.r-project.org/) следующие:

В 500 раз быстрее чемDF[i,j]<-value

Это заставило меня задуматься, что, возможно,data.table или жеdplyr или другие средства могут немного ускорить процесс. Мой мозг был сосредоточен на заполнении ячеек, но, возможно, есть лучший способ, включающий изменение формы, применение функции и изменение формы к матрице или чему-то в этом роде. Я могу добиться этого в базе R с помощьюouter илиfor цикл следующим образом.

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

Вотmicrobenchmark время сfor получить небольшое преимущество.

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

Какой самый быстрый подход к этому в R (добавление пакетов приветствуется)?

Ответы на вопрос(1)

Ваш ответ на вопрос