Быстрее заполнить ячейку матрицы 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 (добавление пакетов приветствуется)?