Effiziente (speicherbasierte) Funktion für wiederholte Entfernungsmatrixberechnungen UND das Zerlegen besonders großer Entfernungsmatrizen

Ich frage mich, ob sich jemand den folgenden Code und das folgende Minimalbeispiel ansehen und Verbesserungen vorschlagen könnte - insbesondere in Bezug auf die Effizienz des Codes bei der Arbeit mit wirklich großen Datenmengen.

Die Funktion nimmt ein data.frame und teilt es durch eine Gruppierungsvariable (Faktor) auf und berechnet dann die Distanzmatrix für alle Zeilen in jeder Gruppe.

Ich muss die Distanzmatrizen nicht aufbewahren - nur einige Statistiken, dh der Mittelwert, das Histogramm ..., dann können sie verworfen werden.

Ich weiß nicht viel über Speicherzuweisung und dergleichen und frage mich, wie ich das am besten machen kann, da ich mit 10.000 - 100.000 Fällen pro Gruppe arbeiten werde. Alle mögliche Gedanken werden sehr geschätzt!

Was wäre auch die schmerzloseste Möglichkeit, BigMemory oder ein anderes Paket für die Verarbeitung großer Datenmengen in die Funktion einzubeziehen, falls ich auf ernsthafte Speicherprobleme stoße?

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

Bearbeiten: Ich habe den Titel bearbeitet, um das Chunking-Problem zu berücksichtigen, das ich als Antwort gepostet habe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage