Ich möchte die Abstände zwischen allen Zeilen einer großen Matrix berechnen. Für jede Zeile muss ich eine andere Zeile finden, die die geringste Entfernung hat. Die endgültige Ausgabe sollte eine Liste sein, die IDs der Zeilen mit den niedrigsten Abständen enthält (siehe Low_dis_ids im folgenden Beispiel).Finden Sie die geringsten Abstände zwischen den Zeilen einer großen Matrix: Allocation limit error
Ich konnte eine Lösung für kleine Probengrößen finden (Beispiel unten). Allerdings kann ich diese Schritte nicht mit größeren Stichproben durchführen, da die Matrix mit den Abständen zu groß wird. Gibt es eine Möglichkeit, solch eine große Matrix wegzulassen? Ich brauche nur die Liste mit den IDs (wie low_dis_ids).
Reproduzierbare Beispiel:
set.seed(123)
# Calculation of distances with small samplesize is working well
N <- 100
data_100 <- data.frame(x1 = rnorm(N, 5, 10),
x2 = rnorm(N, 5, 10),
x3 = rnorm(N, 5, 10),
x4 = rnorm(N, 5, 10),
x5 = rnorm(N, 5, 10))
# Matrix with all distances (no problem for the smaller samplesize)
dist_100 <- as.matrix(dist(data_100))
# Find the row with the smallest distance
for(i in 1:nrow(dist_100)) {
dist_100[i, i] <- Inf
}
low_dis <- numeric()
for(i in 1:nrow(dist_100)) {
low_dis[i] <- as.numeric(sort(dist_100[ , i]))[1]
}
low_dis_ids <- list()
for(i in 1:length(low_dis)) {
low_dis_ids[[i]] <- as.numeric(names(dist_100[ , i][dist_100[ , i] == low_dis[i]]))
}
# low_dis_ids is the desired output and stores the rows with the smallest distances
# The same procedure is not working for larger samplesizes
N <- 100000
data_100000 <- data.frame(x1 = rnorm(N, 5, 10),
x2 = rnorm(N, 5, 10),
x3 = rnorm(N, 5, 10),
x4 = rnorm(N, 5, 10),
x5 = rnorm(N, 5, 10))
dist_100000 <- dist(data_100000)
# Error: cannot allocate vector of size 37.3 Gb
Vielen Dank jamieRowen! Das war genau das, wonach ich suchte! Wie Sie sagten, ist Rolands Code schneller als Ihres, aber da ich nicht weiß, wie man C++ benutzt, bevorzuge ich Ihre Lösung. – JSP
@JoachimSchork, kein Problem. Froh, dass es geholfen hat. – jamieRowen