Dividi i dati in N gruppi uguali


11

Ho un frame di dati che contiene valori su 4 colonne:

Ad esempio: ID, price, click count,rating

Quello che vorrei fare è "dividere" questo frame di dati in N gruppi diversi in cui ogni gruppo avrà lo stesso numero di righe con la stessa distribuzione di prezzo, conteggio dei clic e attributi di classificazione.

Ogni consiglio è molto apprezzato, dato che non ho la minima idea di come affrontarlo!


Stai solo cercando di creare N frame di dati separati che sono sottoinsiemi disgiunti dell'originale? Che cosa intendi per "stessa distribuzione" di prezzo, conteggio dei clic e valutazioni?
Alex A.

Sì, cercando i sottoinsiemi del frame di dati originale. Sulla seconda domanda, supponiamo che io abbia valori di conteggi delle visite da 1 a 10 e abbia deciso di creare 3 diversi sottoinsiemi, quindi selezionerò alcune righe in ciascun gruppo da 1 a 4 bucket di conteggio visite, alcune righe da 4 a 7 bucket di conteggio visite e alcuni da 7 a 10 bucket di conteggio delle visite e questo dovrebbe essere soddisfatto rispetto a tutti gli attributi (prezzo, conteggio dei clic e valutazione). È come campionare i dati in diversi gruppi con uguale probabilità di attributi. Spero che sia di aiuto.


La domanda richiede una divisione che preservi le distribuzioni delle variabili. Senza ulteriori informazioni, non è possibile determinare il metodo corretto con cui affrontare questo problema. Voto per migrare questo su CV.com
DWin

Intendi preservare solo le distribuzioni marginali o la distribuzione congiunta?
kjetil b halvorsen,

Risposte:


12

Se capisco correttamente la domanda, questo ti darà quello che vuoi. Supponendo che venga chiamato il frame di dati dfe che sia stato Ndefinito, è possibile effettuare questa operazione:

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

Ciò restituirà un elenco di frame di dati in cui ogni frame di dati è costituito da righe selezionate casualmente df. Per impostazione predefinita sample()assegnerà la stessa probabilità a ciascun gruppo.


6

Questa è una risposta molto tardi, ma ho trovato questa pagina mentre cercavo su Google se il problema, come affermato, fosse mai stato discusso da nessuna parte. Forse la mia risposta sarà di aiuto se qualcuno trova questa pagina da ora in poi.

Ho scritto un pacchetto R, che fa esattamente quello che ha posto la domanda: prende a data.framee crea N gruppi diversi mentre cerca di minimizzare le differenze tra i gruppi in uno o più criteri. Utilizza un metodo semplice basato su un'assegnazione casuale ripetuta , che è anche il metodo suggerito nella risposta approvata.

Questo è il link al pacchetto minDiff :

Per affrontare il problema dichiarato, è possibile utilizzare:

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

L' repetitionsargomento determinerà la frequenza con cui si creano casualmente gruppi diversi. Verrà restituito il miglior incarico, quello con differenze minime tra i gruppi.


5

Sebbene la risposta di Alex A offra una probabilità uguale per ciascun gruppo, non soddisfa la richiesta della domanda per i gruppi di avere un numero uguale di righe. In R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)

3
La tua osservazione sulle carenze della risposta accettata è buona. Tuttavia, la tua risposta non affronta ancora la parte della domanda di interesse (ed è l'unica ragione per cui non è stata chiusa qui): come si ottiene la "stessa distribuzione di prezzo, conteggio dei clic e attributi di classificazione" in ciascun gruppo ?
whuber

@whuber Puoi proporci una risposta qui?
Léo Léopold Hertz

La risposta dovrebbe dipendere dal significato di "stessa distribuzione". Sembra che la domanda sia quella di raggruppare le osservazioni in base a quattro variabili, con ogni gruppo con lo stesso numero di osservazioni. Ci sono una miriade di modi per farlo.
whuber

0

Questo può essere risolto con l'annidamento usando tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.