Wie kann ich die Zeichen jeder Zeichenfolge in einem Vektor effizient sortieren? Beispiel: Geben Sie einen Vektor von Zeichenfolgen an:
set.seed(1)
strings <- c(do.call(paste0, replicate(4, sample(LETTERS, 10000, TRUE), FALSE)),
do.call(paste0, replicate(3, sample(LETTERS, 10000, TRUE), FALSE)),
do.call(paste0, replicate(2, sample(LETTERS, 10000, TRUE), FALSE)))
Ich habe eine Funktion geschrieben, die jede Zeichenfolge in einen Vektor aufteilt, den Vektor sortiert und dann die Ausgabe reduziert:
sort_cat <- function(strings){
tmp <- strsplit(strings, split="")
tmp <- lapply(tmp, sort)
tmp <- lapply(tmp, paste0, collapse = "")
tmp <- unlist(tmp)
return(tmp)
}
sorted_strings <- sort_cat(strings)
Der Vektor der Zeichenfolgen, auf den ich dies anwenden muss, ist jedoch sehr lang und diese Funktion ist zu langsam. Hat jemand Vorschläge zur Verbesserung der Leistung?
r
string
performance
sorting
Powege
quelle
quelle
letters
haben nicht immer die Länge drei wie in Ihrem Beispiel, oder?fixed = TRUE
instrsplit()
kann die Leistung verbessern , da es nicht die Verwendung von Regex beteiligen.Antworten:
Sie können die Zeit verkürzen, indem Sie die Anzahl der Schleifen sicher minimieren, und dies auch mithilfe des
parallel
Pakets. Mein Ansatz wäre, Zeichenfolgen einmal zu teilen und dann in der Schleife zu sortieren und einzufügen:Rasiert sich wie 4 Sekunden, aber es ist immer noch nicht so schnell ...
Bearbeiten
Okay, ich habe es mit der
apply
Strategie hier geschafft:1) Buchstaben extrahieren anstatt Grenzen zu teilen 2) eine Matrix mit den Ergebnissen erstellen 3) zeilenweise durchlaufen 4) sortieren 5) verbinden
Sie vermeiden , mehrere Schleifen und Entadressierung .... IGNORE:
? Nachteil ist , wenn Strings unterschiedlicher Länge, werden Sie eine leere oder NA im entfernen müssenapply
, wiei[!is.na(i) && nchar(i) > 0]
Bringt uns von 10,3 Sekunden auf 3,98
quelle
tmp <- strsplit(strings, split="") unlist(mclapply(tmp, function(i){ paste0(sort(i), collapse = "") }))
stringi
ist bei weitem mein Lieblingspaket Mann ...Eine erneute Implementierung mit
stringi
führt zu einer ungefähr 4-fachen Beschleunigung. Ich habe auch bearbeitetsort_cat
, umfixed = TRUE
in der zu verwendenstrsplit
, was es ein wenig schneller macht. Und danke an Carl für den Single-Loop-Vorschlag, der uns ein bisschen mehr beschleunigt.Diese Methode könnte auch parallel angewendet werden. Das Profilieren des Codes, um festzustellen, welche Vorgänge tatsächlich am längsten dauern, ist ein guter nächster Schritt, wenn Sie noch schneller arbeiten möchten.
quelle
Diese Version ist etwas schneller
Aber ich denke, es könnte optimiert werden
quelle