Ich fragte vor kurzem eine Frage über die Verbesserung der Leistung in meinem Code (Faster method than "while" loop to find chain of infection in R).Erhöhung der Geschwindigkeit mit While-Schleifen: Suche nach mehreren Infektionsketten in R
Hintergrund: Ich analysiere große Tabellen (300 000 - 500 000 Zeilen), die Datenausgabe von einem Krankheitssimulationsmodell speichern. Im Modell infizieren Tiere in einer Landschaft andere Tiere. Zum Beispiel infiziert in dem unten abgebildeten Beispiel Tier a1
jedes Tier in der Landschaft und die Infektion bewegt sich von Tier zu Tier und verzweigt sich in "Ketten" der Infektion.
In meiner ursprünglichen Frage, fragte ich, wie ich einen data.frame entsprechend Tier "d2
" s "Infektionskette (siehe unten, grün umrissen für die Darstellung einer" Kette ") ausgeben könnte. Die vorgeschlagene Lösung funktionierte gut für ein Tier.
In Wirklichkeit ich brauche Ketten für etwa 400 Tiere zu berechnen, auf eine Teilmenge aller Tiere entspricht (allanimals
Tabelle).
ich habe eine inbegriffen Link zu einem example dataset, das groß genug ist, um zu spielen mit.
Hier ist der Code für eine Kette, beginnend mit Tier 5497370 und Beachten Sie, dass ich Spaltennamen aus meiner vorherigen Frage leicht geändert habe, und den Code aktualisiert!
Der Code:
allanimals <- read.csv("https://www.dropbox.com/s/0o6w29lz8yzryau/allanimals.csv?raw=1",
stringsAsFactors = FALSE)
# Here's an example animal
ExampleAnimal <- 5497370
ptm <- proc.time()
allanimals_ID <- setdiff(unique(c(allanimals$ID, allanimals$InfectingAnimal_ID)), -1)
infected <- rep(NA_integer_, length(allanimals_ID))
infected[match(allanimals$ID, allanimals_ID)] <-
match(allanimals$InfectingAnimal_ID, allanimals_ID)
path <- rep(NA_integer_, length(allanimals_ID))
curOne <- match(ExampleAnimal, allanimals_ID)
i <- 1
while (!is.na(nextOne <- infected[curOne])) {
path[i] <- curOne
i <- i + 1
curOne <- nextOne
}
chain <- allanimals[path[seq_len(i - 1)], ]
chain
proc.time() - ptm
# check it out
chain
I Ketten zur Ausgabe für jedes Tier möchten in "sel.set
":
sel.set <- allanimals %>%
filter(HexRow < 4 & Year == 130) %>%
pull("ID")
Wenn möglich, Ich möchte jede speichern "Kette" data.frame als Liste mit Länge = Anzahl der Ketten.
Es scheint, als ob dieses Problem im datengenerierenden Schritt trivial sein könnte ... – Gregor
@Gregor Könnten Sie das näher erläutern? –
Wenn es möglich ist, den Code für das Krankheitssimulationsmodell zu bearbeiten, könnte er diese Information mit der Ausgabe einschließen. – Gregor