Эффективная (по памяти) функция для повторных вычислений матрицы расстояний И разбиения матриц очень большого расстояния

Интересно, может ли кто-нибудь взглянуть на следующий код и минимальный пример и предложить улучшения - в частности, в отношении эффективности кода при работе с действительно большими наборами данных.

Функция берет 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

Изменить: я отредактировал заголовок, чтобы отразить чанк-проблему, которую я отправил в качестве ответа.

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

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