Ich muss einen Vektor in n gleich große Blöcke in R aufteilen. Ich konnte keine Basisfunktion dafür finden. Auch Google hat mich nicht weitergebracht. Also hier ist, was ich mir ausgedacht habe, hoffentlich hilft es jemandem wo.
x <- 1:10
n <- 3
chunk <- function(x,n) split(x, factor(sort(rank(x)%%n)))
chunk(x,n)
$`0`
[1] 1 2 3
$`1`
[1] 4 5 6 7
$`2`
[1] 8 9 10
Kommentare, Vorschläge oder Verbesserungen sind sehr willkommen und werden geschätzt.
Prost, Sebastian
x <- c(NA, 4, 3, NA, NA, 2, 1, 1, NA ); y <- letters[x]; z <- factor(y)
gibt Beispiele mit fehlenden Daten, wiederholten Werten, die noch nicht sortiert sind und in verschiedenen Klassen (Ganzzahl, Zeichen, Faktor) sind.Antworten:
Ein Einzeiler, der d in Stücke der Größe 20 aufteilt:
Weitere Details: Ich denke , alles was Sie brauchen
seq_along()
,split()
undceiling()
:quelle
n
gleich großen Stücken. Dadurch erhalten Sie eine unbekannte Anzahl von Blöckenn
. Ich hatte das gleiche Problem und verwendete die Lösungen von @mathheadinclouds.n-chunks
ich verwendetmax <- length(d)%/%n
. Ich habe dies mit einem Vektor von 31 Zeichenfolgen verwendet und eine Liste von 3 Vektoren mit 10 Sätzen und einem von 1 Satz erhalten.quelle
quelle
Probieren Sie die Funktion ggplot2 aus
cut_number
:quelle
x
,y
oderz
in definiert diesen Kommentar . Insbesondere werden die Ergebnisse sortiert, die je nach Anwendung in Ordnung sein können oder nicht.Dies wird es anders aufteilen als das, was Sie haben, aber es ist immer noch eine nette Listenstruktur, denke ich:
Je nachdem, wie Sie es formatieren möchten, erhalten Sie Folgendes:
Ausführen einiger Timings mit diesen Einstellungen:
Dann haben wir folgende Ergebnisse:
BEARBEITEN: Der Wechsel von as.factor () zu as.character () in meiner Funktion hat es doppelt so schnell gemacht.
quelle
Noch ein paar Varianten zum Stapel ...
Beachten Sie, dass Sie die
factor
Funktion hier nicht verwenden müssen , aber dennochsort
Ihren ersten Vektor verwenden möchten1 2 3 10
:Oder Sie können Zeichenindizes zuweisen, indem Sie die Zahlen in den linken Häkchen oben angeben:
Oder Sie können in einem Vektor gespeicherte Klarwortnamen verwenden. Beachten Sie, dass die Beschriftung verwendet wird
sort
, um aufeinanderfolgende Werte inx
alphabetischer Reihenfolge abzurufen:quelle
Verwenden von Basis-R
rep_len
:Und wie bereits erwähnt, wenn Sie sortierte Indizes wünschen, einfach:
quelle
Sie können den von mdsummer vorgeschlagenen Split / Cut mit dem Quantil kombinieren, um gleichmäßige Gruppen zu erstellen:
Dies ergibt das gleiche Ergebnis für Ihr Beispiel, jedoch nicht für verzerrte Variablen.
quelle
split(x,matrix(1:n,n,length(x))[1:length(x)])
Vielleicht ist das klarer, aber die gleiche Idee:
split(x,rep(1:n, ceiling(length(x)/n),length.out = length(x)))
Wenn Sie möchten, dass es bestellt wird, werfen Sie eine Sorte darum
quelle
Ich brauchte die gleiche Funktion und habe die vorherigen Lösungen gelesen, aber ich musste auch den unausgeglichenen Block am Ende haben, dh wenn ich 10 Elemente habe, um sie in Vektoren von jeweils 3 aufzuteilen, sollte mein Ergebnis Vektoren mit 3 haben. Jeweils 3,4 Elemente. Also habe ich Folgendes verwendet (ich habe den Code für die Lesbarkeit nicht optimiert, sonst müssen nicht viele Variablen vorhanden sein):
quelle
Hier ist eine andere Variante.
HINWEIS: In diesem Beispiel geben Sie die CHUNK SIZE im zweiten Parameter an
quelle
Einfache Funktion zum Teilen eines Vektors durch einfaches Verwenden von Indizes - dies muss nicht zu kompliziert sein
quelle
Wenn Sie nicht mögen
split()
und Sie nicht mögenmatrix()
(mit seinen baumelnden NAs), gibt es Folgendes:Wie
split()
, es gibt eine Liste, aber es hat keine Zeit oder Raum mit Etiketten verschwenden, so dass es mehr performant sein kann.quelle
Dank an @Sebastian für diese Funktion
quelle
Wenn Sie nicht mögen
split()
und es Ihnen nichts ausmacht, dass NAs Ihren kurzen Schwanz auspolstern:Die Spalten der zurückgegebenen Matrix ([, 1: ncol]) sind die Droiden, nach denen Sie suchen.
quelle
Ich benötige eine Funktion, die das Argument einer data.table (in Anführungszeichen) und ein anderes Argument verwendet, das die Obergrenze für die Anzahl der Zeilen in den Teilmengen dieser ursprünglichen data.table darstellt. Diese Funktion erzeugt eine beliebige Anzahl von data.tables, die die Obergrenze zulässt:
Diese Funktion gibt mir eine Reihe von data.tables mit dem Namen df_ [number] mit der Startzeile aus der ursprünglichen data.table im Namen. Die letzte Datentabelle kann kurz und mit NAs gefüllt sein, sodass Sie diese auf die verbleibenden Daten zurücksetzen müssen. Diese Art von Funktion ist nützlich, da bestimmte GIS-Software beispielsweise die Anzahl der zu importierenden Adresspins begrenzt. Das Aufteilen von data.tables in kleinere Blöcke wird möglicherweise nicht empfohlen, ist jedoch möglicherweise nicht vermeidbar.
quelle
Tut mir leid, wenn diese Antwort so spät kommt, aber vielleicht kann sie für jemand anderen nützlich sein. Tatsächlich gibt es eine sehr nützliche Lösung für dieses Problem, die am Ende von? Split erläutert wird.
quelle
Eine weitere Möglichkeit ist die
splitIndices
Funktion aus dem Paketparallel
:Gibt:
quelle
Wow, diese Frage hat mehr Traktion als erwartet.
Danke für all die Ideen. Ich habe mir diese Lösung ausgedacht:
Der Schlüssel ist, den Parameter seq (each = chunk.size) zu verwenden, damit es funktioniert. Die Verwendung von seq_along verhält sich in meiner vorherigen Lösung wie Rang (x), kann jedoch mit doppelten Einträgen das richtige Ergebnis erzielen.
quelle
Dies teilt sich in Blöcke der Größe ⌊n / k⌋ + 1 oder ⌊n / k⌋ auf und verwendet nicht die Sortierung O (n log n).
quelle