Podziel dane na N równych grup

11

Mam ramkę danych, która zawiera wartości w 4 kolumnach:

Na przykład: ID, price, click count,rating

Chciałbym „podzielić” tę ramkę danych na N różnych grup, w których każda grupa będzie miała taką samą liczbę wierszy z takim samym rozkładem ceny, liczby kliknięć i atrybutów ocen.

Wszelkie porady są mile widziane, ponieważ nie mam najmniejszego pojęcia, jak sobie z tym poradzić!

Rajpal Kulhari
źródło
Czy chcesz po prostu utworzyć N osobnych ramek danych, które są rozłącznymi podzbiorami oryginału? Co rozumiesz przez „taki sam rozkład” ceny, liczby kliknięć i ocen?
Alex A.
Tak, szukam podzbiorów oryginalnej ramki danych. Na drugie pytanie, załóżmy, że mam wartości liczby odwiedzin od 1 do 10 i postanowiłem utworzyć 3 różne podzestawy, więc wybiorę niektóre wiersze w każdej grupie od 1 do 4 segmentu liczby odwiedzin, niektóre wiersze od 4 do 7 segmentu liczby odwiedzin i niektóre z przedziału od 7 do 10 odwiedzin i to powinno być spełnione w odniesieniu do wszystkich atrybutów (cena, liczba kliknięć i ocena). To jak próbkowanie danych do różnych grup z jednakowym prawdopodobieństwem atrybutów. Mam nadzieję że to pomoże.
możliwy duplikat języka R: jak podzielić ramkę danych
Alex A.
Pytanie wymaga podziału, który zachowuje rozkłady zmiennych. Bez dalszych informacji nie można ustalić właściwej metody rozwiązania tego problemu. Głosuję za przeniesieniem tego na CV.com
DW
Czy chcesz zachować tylko rozkłady krańcowe czy wspólne?
kjetil b halvorsen

Odpowiedzi:

12

Jeśli dobrze zrozumiem pytanie, uzyskasz to, czego chcesz. Zakładając, że twoja ramka danych jest wywoływana dfi masz Nzdefiniowane, możesz to zrobić:

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

Zwróci to listę ramek danych, z których każda ramka danych składa się z losowo wybranych wierszy df. Domyślnie sample()przypisze równe prawdopodobieństwo każdej grupie.

Alex A.
źródło
6

To jest bardzo późna odpowiedź, ale znalazłem tę stronę podczas przeglądania google, czy opisany problem kiedykolwiek był omawiany. Może moja odpowiedź pomoże, jeśli ktoś znajdzie tę stronę od teraz.

Napisałem pakiet R, który robi dokładnie to, o co pytano: bierze a data.framei tworzy N różnych grup, próbując zminimalizować różnice między grupami w jednym lub kilku kryteriach. Wykorzystuje prostą metodę opartą na wielokrotnym losowym przypisywaniu, która jest również sugerowaną metodą w zatwierdzonej odpowiedzi.

To jest link do pakietu minDiff :

Aby rozwiązać opisany problem, możesz użyć:

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

repetitionsArgumentem będzie określić, jak często losowo tworzyć różne grupy. Najlepsze zadanie - to, które ma minimalne różnice między grupami - zostanie zwrócone.

M. Papenberg
źródło
5

Chociaż odpowiedź Alexa A daje równe prawdopodobieństwo dla każdej grupy, nie spełnia ona żądania pytania, aby grupy miały taką samą liczbę wierszy. W R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)
Scott Kaiser
źródło
3
Twoja obserwacja na temat braków przyjętej odpowiedzi jest dobra. Jednak twoja odpowiedź wciąż nie odnosi się do interesującej części pytania (i jest to jedyny powód, dla którego nie została tutaj zamknięta): jak osiągnąć „taki sam rozkład ceny, liczby kliknięć i atrybutów ocen” w każdej grupie ?
whuber
@whuber Czy możesz tutaj zaproponować odpowiedź?
Léo Léopold Hertz -
Odpowiedź powinna zależeć od tego, co oznacza „ta sama dystrybucja”. Wydaje się, że pytanie dotyczy obserwacji skupień w oparciu o cztery zmienne, przy czym każde skupienie ma tę samą liczbę obserwacji. Istnieją niezliczone sposoby, aby to zrobić.
whuber
0

Można to rozwiązać za pomocą zagnieżdżania za pomocą tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Holger Brandl
źródło