Ich habe einen Datenrahmen (df1) wie diesen.
f1 f2 f3 f4 f5
d1 1 0 1 1 1
d2 1 0 0 1 0
d3 0 0 0 1 1
d4 0 1 0 0 1
Die Spalte d1 ... d4 ist der Rowname, die Zeile f1 ... f5 ist der Spaltenname.
Um Beispiel (df1) zu machen, erhalte ich einen neuen Datenrahmen mit der Anzahl 1, der mit df1 identisch ist. Die Anzahl 1 bleibt also für den gesamten Datenrahmen erhalten, jedoch nicht für jede Zeile oder Spalte.
Ist es möglich, die Randomisierung zeilenweise oder spaltenweise durchzuführen?
Ich möchte die df1 spaltenweise für jede Spalte randomisieren, dh die Zahl 1 in jeder Spalte bleibt gleich. und jede Spalte muss mindestens einmal geändert werden. Zum Beispiel kann ich eine zufällige df2 wie diese haben: (Es wurde festgestellt, dass die Anzahl von 1 in jeder Spalte gleich bleibt, aber die Anzahl von 1 in jeder Zeile unterschiedlich ist.
f1 f2 f3 f4 f5
d1 1 0 0 0 1
d2 0 1 0 1 1
d3 1 0 0 1 1
d4 0 0 1 1 0
Ebenso möchte ich auch die df1 zeilenweise für jede Zeile randomisieren, dh die Nr. von 1 in jeder Zeile bleibt gleich und jede Zeile muss geändert werden (aber die Anzahl der geänderten Einträge kann unterschiedlich sein). Zum Beispiel könnte ein randomisierter df3 ungefähr so aussehen:
f1 f2 f3 f4 f5
d1 0 1 1 1 1 <- two entries are different
d2 0 0 1 0 1 <- four entries are different
d3 1 0 0 0 1 <- two entries are different
d4 0 0 1 0 1 <- two entries are different
PS. Vielen Dank für die Hilfe von Gavin Simpson, Joris Meys und Chase für die vorherigen Antworten auf meine vorherige Frage zur Randomisierung von zwei Spalten.
quelle
Antworten:
Angesichts des R-Datenrahmens:
Reihenweise mischen:
Standardmäßig
sample()
werden die als erstes Argument übergebenen Elemente nach dem Zufallsprinzip neu angeordnet. Dies bedeutet, dass die Standardgröße die Größe des übergebenen Arrays ist. Durch Übergeben des Parametersreplace=FALSE
(Standardeinstellung) wirdsample(...)
sichergestellt, dass die Abtastung ersatzlos erfolgt, wodurch ein zeilenweises Mischen durchgeführt wird.Spaltenweise mischen:
quelle
Dies ist eine weitere Möglichkeit, das
data.frame
using-Paket zu mischendplyr
:Reihenweise:
oder
Spaltenweise:
quelle
Schauen Sie sich
permatswap()
das vegane Paket an. Hier ist ein Beispiel, in dem sowohl Zeilen- als auch Spaltensummen beibehalten werden. Sie können dies jedoch lockern und nur eine der Zeilen- oder Spaltensummen korrigieren.Das gibt:
Um den Anruf zu erklären:
times
ist die Anzahl der gewünschten zufälligen Matrizen, hier 99burnin
ist die Anzahl der getauschten Swaps, bevor wir mit der Stichprobenentnahme beginnen. Dies ermöglicht, dass die Matrix, aus der wir eine Stichprobe erstellen, ziemlich zufällig ist, bevor wir mit der Entnahme jeder unserer randomisierten Matrizen beginnenthin
sagt, nimm nur einen zufälligen Draw bei jedemthin
Swapmtype = "prab"
sagt, behandeln Sie die Matrix als Anwesenheit / Abwesenheit, dh binäre 0/1-Daten.Ein paar Dinge zu beachten, dies garantiert nicht, dass eine Spalte oder Zeile zufällig ausgewählt wurde, aber wenn sie
burnin
lang genug ist, sollte eine gute Chance bestehen, dass dies passiert ist. Außerdem können Sie mehr zufällige Matrizen zeichnen, als Sie benötigen, und solche verwerfen, die nicht allen Ihren Anforderungen entsprechen.Ihre Anforderung, eine unterschiedliche Anzahl von Änderungen pro Zeile vorzunehmen, wird hier ebenfalls nicht behandelt. Auch hier können Sie mehr Matrizen abtasten, als Sie möchten, und dann diejenigen verwerfen, die diese Anforderung ebenfalls nicht erfüllen.
quelle
Sie können die
randomizeMatrix
Funktion auch im R-Paket verwendenpicante
Beispiel:
Die Option
null.model="frequency"
verwaltet Spaltensummen undrichness
Zeilensummen. Obwohl es hauptsächlich zur Randomisierung von Datensätzen zur Abwesenheit von Arten in der Gemeinschaftsökologie verwendet wird, funktioniert es hier gut.Diese Funktion bietet auch andere Nullmodelloptionen. Weitere Informationen (Seite 36) der Dokumentation finden Sie unter folgendem Link (Seite 36)
picante
quelle
Natürlich können Sie jede Zeile probieren:
mischt die Zeilen selbst, sodass sich die Anzahl der Zeilen
1
in jeder Zeile nicht ändert. Kleine Änderungen und es funktioniert auch gut mit Spalten, aber dies ist eine Übung für den Leser :-Pquelle
Sie können auch die gleiche Anzahl von Elementen in Ihrem Datenrahmen mit so etwas "abtasten":
quelle
dim(M)[1]
können Sie verwenden,nrow(M)
damit das gesamte Verfahren zu einem Einzeiler wird:random_M <- M[nrow(M),]
Wenn das Ziel darin besteht, jede Spalte zufällig zu mischen, funktionieren einige der obigen Antworten nicht, da die Spalten gemeinsam gemischt werden (dies bewahrt die Korrelationen zwischen den Spalten). Andere erfordern die Installation eines Pakets. Es gibt jedoch einen Einzeiler:
quelle
Zufällige Stichproben und Permutationen in einem Datenrahmen Wenn diese in Matrixform in data.frame konvertiert sind, verwenden Sie die Beispielfunktion aus den Basispaketindizes = sample (1: nrow (df1), size = 1 * nrow (df1)) Zufällige Stichproben und Permutationen
quelle