Эффективная (по памяти) функция для повторных вычислений матрицы расстояний И разбиения матриц очень большого расстояния
Интересно, может ли кто-нибудь взглянуть на следующий код и минимальный пример и предложить улучшения - в частности, в отношении эффективности кода при работе с действительно большими наборами данных.
Функция берет data.frame и разделяет его по группирующей переменной (коэффициент), а затем вычисляет матрицу расстояний для всех строк в каждой группе.
Мне не нужно хранить матрицы расстояний - только некоторая статистика, т.е. среднее значение, гистограмма ..., тогда они могут быть отброшены.
Я не очень разбираюсь в распределении памяти и тому подобном, и мне интересно, как лучше всего это сделать, так как я буду работать с 10 000 - 100 000 случаев на группу. Любые мысли будут с благодарностью!
Кроме того, что было бы наименее болезненным способом включения большой памяти или какого-либо другого пакета обработки больших данных в функцию, как в случае, если у меня возникнут серьезные проблемы с памятью?
FactorDistances <- function(df) {
# df is the data frame where the first column is the grouping variable.
# find names and number of groups in df (in the example there are three:(2,3,4)
factor.names <- unique(df[1])
n.factors <-length(unique(df$factor))
# split df by factor into list - each subset dataframe is one list element
df.l<-list()
for (f in 1:n.factors) {df.l[[f]]<-df[which(df$factor==factor.names[f,]),]}
# use lapply to go through list and calculate distance matrix for each group
# this results in a new list where each element is a distance matrix
distances <- lapply (df.l, function(x) dist(x[,2:length(x)], method="minkowski", p=2))
# again use lapply to get the mean distance for each group
means <- lapply (distances, mean)
rm(distances)
gc()
return(means)
}
df <- data.frame(cbind(factor=rep(2:4,2:4), rnorm(9), rnorm(9)))
FactorDistances(df)
# The result are three average euclidean distances between all pairs in each group
# If a group has only one member, the value is NaN
Изменить: я отредактировал заголовок, чтобы отразить чанк-проблему, которую я отправил в качестве ответа.