Teilen Sie die Daten in N gleiche Gruppen auf

11

Ich habe einen Datenrahmen, der Werte in 4 Spalten enthält:

Zum Beispiel: ID, price, click count,rating

Was ich tun möchte, ist, diesen Datenrahmen in N verschiedene Gruppen "aufzuteilen", wobei jede Gruppe die gleiche Anzahl von Zeilen mit der gleichen Verteilung von Preis-, Klickzahl- und Bewertungsattributen hat.

Jeder Rat wird sehr geschätzt, da ich nicht die geringste Ahnung habe, wie ich das angehen soll!

Rajpal Kulhari
quelle
Möchten Sie nur N separate Datenrahmen erstellen, die disjunkte Teilmengen des Originals sind? Was meinen Sie mit der "gleichen Verteilung" von Preis, Klickzahl und Bewertungen?
Alex A.
Ja, suchen Sie nach den Teilmengen des ursprünglichen Datenrahmens. Angenommen, ich habe bei Ihrer zweiten Frage Werte für die Anzahl der Besuche von 1 bis 10 und habe beschlossen, 3 verschiedene Teilmengen zu erstellen. Wählen Sie daher einige Zeilen in jeder Gruppe mit 1 bis 4 Besuchszählern, einige Zeilen mit 4 bis 7 Besuchszählern und aus Einige von 7 bis 10 Besuchern zählen und dies sollte in Bezug auf alle Attribute (Preis, Klickzahl und Bewertung) erfüllt sein. Es ist so, als würden die Daten mit gleicher Wahrscheinlichkeit von Attributen in verschiedene Gruppen eingeteilt. Hoffe das hilft.
Mögliches Duplikat der R-Sprache: So teilen Sie einen Datenrahmen
Alex A.
Die Frage fordert eine Aufteilung an, bei der die Verteilungen der Variablen erhalten bleiben. Ohne weitere Informationen ist es nicht möglich, die richtige Methode zur Lösung dieses Problems zu ermitteln. Ich stimme dafür, dies auf CV.com zu migrieren
DWin
Wollen Sie nur die Randverteilungen oder die gemeinsame Verteilung erhalten?
kjetil b halvorsen

Antworten:

12

Wenn ich die Frage richtig verstehe, erhalten Sie das, was Sie wollen. Angenommen, Ihr Datenrahmen wird aufgerufen dfund Sie haben ihn Ndefiniert, können Sie Folgendes tun:

split(df, sample(1:N, nrow(df), replace=T))

Dies gibt eine Liste von Datenrahmen zurück, aus denen jeder Datenrahmen aus zufällig ausgewählten Zeilen besteht df. Standardmäßig sample()wird jeder Gruppe die gleiche Wahrscheinlichkeit zugewiesen.

Alex A.
quelle
6

Dies ist eine sehr späte Antwort, aber ich habe diese Seite gefunden, als ich gegoogelt habe, ob das angegebene Problem jemals irgendwo diskutiert wurde. Vielleicht hilft meine Antwort, wenn jemand diese Seite von nun an findet.

Ich habe ein R-Paket geschrieben, das genau das tut, wonach die Frage gestellt wurde: Es benötigt a data.frameund erstellt N verschiedene Gruppen, während versucht wird, die Unterschiede zwischen Gruppen in einem oder mehreren Kriterien zu minimieren. Es wird eine einfache Methode verwendet, die auf wiederholter zufälliger Zuweisung basiert. Dies ist auch die vorgeschlagene Methode in der genehmigten Antwort.

Dies ist der Link zum Paket minDiff :

Um das angegebene Problem zu lösen, können Sie Folgendes verwenden:

library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)

Das repetitionsArgument bestimmt, wie oft Sie zufällig verschiedene Gruppen erstellen. Die beste Zuordnung - die mit minimalen Unterschieden zwischen den Gruppen - wird zurückgegeben.

M. Papenberg
quelle
5

Obwohl die Antwort von Alex A für jede Gruppe die gleiche Wahrscheinlichkeit ergibt, entspricht sie nicht der Anforderung der Frage, dass die Gruppen die gleiche Anzahl von Zeilen haben sollen. In R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)
Scott Kaiser
quelle
3
Ihre Beobachtung über die Mängel der akzeptierten Antwort ist gut. Ihre Antwort behandelt jedoch immer noch nicht den Teil der Frage, der von Interesse ist (und der einzige Grund, warum sie hier nicht geschlossen wurde): Wie erreichen Sie die "gleiche Verteilung von Preis-, Klickzahl- und Bewertungsattributen" in jeder Gruppe? ?
whuber
@whuber Kannst du hier eine Antwort darauf vorschlagen?
Léo Léopold Hertz 준영
Die Antwort sollte davon abhängen, was "gleiche Verteilung" bedeutet. Es scheint, dass die Frage lautet, Beobachtungen anhand von vier Variablen zu gruppieren , wobei jeder Cluster die gleiche Anzahl von Beobachtungen aufweist. Es gibt unzählige Möglichkeiten, dies zu tun.
whuber
0

Dies kann durch Verschachteln mit tidyr / dplyr gelöst werden

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Holger Brandl
quelle