Diviser les données en N groupes égaux

11

J'ai un cadre de données qui contient des valeurs sur 4 colonnes:

Par exemple: ID, price, click count,rating

Ce que je voudrais faire, c'est "diviser" cette trame de données en N groupes différents où chaque groupe aura un nombre égal de lignes avec la même distribution de prix, le nombre de clics et les attributs de notes.

Tout conseil est fortement apprécié, car je n'ai pas la moindre idée de la façon de résoudre ce problème!

Rajpal Kulhari
la source
Cherchez-vous simplement à créer N trames de données distinctes qui sont des sous-ensembles disjoints de l'original? Qu'entendez-vous par «même répartition» du prix, du nombre de clics et des notes?
Alex A.
Oui, à la recherche des sous-ensembles de la trame de données d'origine. Sur votre deuxième question, supposons que j'ai des valeurs de nombre de visites de 1 à 10 et que j'ai décidé de créer 3 sous-ensembles différents, donc sélectionnera quelques lignes dans chaque groupe de 1 à 4 compartiments de nombre de visites, quelques lignes de 4 à 7 compartiments de nombre de visites et certains de 7 à 10 seaux de décomptes de visites et cela devrait être satisfait en ce qui concerne tous les attributs (prix, nombre de clics et évaluation). C'est comme échantillonner les données dans différents groupes avec une probabilité égale d'attributs. J'espère que cela t'aides.
La question demande un fractionnement qui préserve les distributions des variables. Sans plus d'informations, il n'est pas possible de déterminer la méthode correcte pour aborder ce problème. Je vote pour migrer vers CV.com
DWin
Voulez-vous conserver uniquement les distributions marginales ou la distribution conjointe?
kjetil b halvorsen

Réponses:

12

Si je comprends bien la question, cela vous donnera ce que vous voulez. En supposant que votre bloc de données est appelé dfet que vous l'avez Ndéfini, vous pouvez le faire:

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

Cela renverra une liste de trames de données où chaque trame de données se compose de lignes sélectionnées au hasard à partir de df. Par défaut sample(), une probabilité égale sera attribuée à chaque groupe.

Alex A.
la source
6

Ceci est une réponse très tardive, mais j'ai trouvé cette page en cherchant sur Google si le problème tel qu'énoncé a déjà été discuté n'importe où. Peut-être que ma réponse vous aidera si quelqu'un trouve cette page à partir de maintenant.

J'ai écrit un package R, qui fait exactement ce que la question demandait: il prend un data.frameet crée N groupes différents tout en essayant de minimiser les différences entre les groupes dans un ou plusieurs critères. Il utilise une méthode simple basée sur l'assignation aléatoire répétée , qui est également la méthode suggérée dans la réponse approuvée.

Voici le lien vers le package minDiff :

Pour résoudre le problème déclaré, vous pouvez utiliser:

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

L' repetitionsargument déterminera la fréquence à laquelle vous créez aléatoirement différents groupes. La meilleure affectation - celle qui présente le moins de différences entre les groupes - sera renvoyée.

M. Papenberg
la source
5

Bien que la réponse d'Alex A donne une probabilité égale pour chaque groupe, elle ne répond pas à la demande de la question pour les groupes d'avoir un nombre égal de lignes. Dans R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)
Scott Kaiser
la source
3
Votre observation sur les lacunes de la réponse acceptée est bonne. Cependant, votre réponse ne répond toujours pas à la partie de la question qui vous intéresse (et c'est la seule raison pour laquelle elle n'a pas été fermée ici): comment obtenez-vous la "même distribution de prix, le nombre de clics et les attributs de notation" dans chaque groupe ?
whuber
@whuber Pouvez-vous proposer une réponse à cela ici?
Léo Léopold Hertz
La réponse devrait dépendre de ce que signifie "même distribution". Il semble que la question demande de regrouper les observations en fonction de quatre variables, chaque groupe ayant le même nombre d'observations. Il existe une multitude de façons de procéder.
whuber
0

Cela peut être résolu par l'imbrication à l'aide de tidyr / dplyr

require(dplyr) 
require(tidyr)

num_groups = 10

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