le fractionnement d'une variable continue en groupes de taille égale
J'ai besoin de split/de la répartition d'une variable continue en 3 groupes de taille égale.
Exemple bloc de données
das <- data.frame(anim=1:15,
wt=c(181,179,180.5,201,201.5,245,246.4,
189.3,301,354,369,205,199,394,231.3))
Après être coupés (selon la valeur de wt
), j'aurais besoin d'avoir les 3 classes en vertu de la nouvelle variable wt2
comme ceci:
> das
anim wt wt2
1 1 181.0 1
2 2 179.0 1
3 3 180.5 1
4 4 201.0 2
5 5 201.5 2
6 6 245.0 2
7 7 246.4 3
8 8 189.3 1
9 9 301.0 3
10 10 354.0 3
11 11 369.0 3
12 12 205.0 2
13 13 199.0 1
14 14 394.0 3
15 15 231.3 2
Ce serait appliquée à un grand ensemble de données
- Voir, par exemple : stackoverflow.com/questions/5915916/... , stackoverflow.com/questions/2647639/... , stackoverflow.com/questions/5570293/... , stackoverflow.com/questions/5161055/... , stackoverflow.com/questions/5731116/... , stackoverflow.com/questions/3288361/... , ...
- Êtes-vous sûr que la réponse de @Ben Bolker n'est pas la bonne? Vous spécifiez que vous voulez l'égalité des moyennes des groupes.
Vous devez vous connecter pour publier un commentaire.
essayez ceci:
si vous voulez répartis en fonction de la valeur de
wt
, puisde toute façon, vous pouvez le faire en combinant les
cut
,cut2
etsplit
.Mis à JOUR
si vous voulez un groupe de l'indice de colonne supplémentaires, puis
si la colonne doit être index comme 1, 2, ..., puis
DE NOUVEAU MIS À JOUR
essayez ceci:
cut(das$anim, 3, labels=FALSE)
Hmisc::cut2()
solution ne l'est pas? Pouvez-vous donner un petit exemple où il ne l'est pas?Ou voir
cut_number
de laggplot2
paquet, par exempleNoter que
cut(...,3)
divise la plage de données d'origine dans trois gammes de longueurs égales; il n'a pas nécessairement le même nombre de observations par groupe si les données sont réparties de manière inégale (vous pouvez reproduire ce quecut_number
le fait en utilisantquantile
de façon appropriée, mais c'est une fonction de commodité). D'autre part,Hmisc::cut2()
à l'aide de lag=
argument ne divisé par quantiles, donc c'est plus ou moins équivalent àggplot2::cut_number
. J'aurais pensé que quelque chose commecut_number
aurait fait son chemin dansdplyr
par la mesure, mais aussi loin que je peux dire il n'a pas.Voici une autre solution à l'aide de la
bin_data()
fonction de la mltools paquet.ntile
dedplyr
maintenant, n'est ce mais se comporte bizarrement avecNA
's.J'ai utilisé le même code dans la fonction suivante, qui travaille dans la base de R et ne l'équivalent de la
cut2
solution ci-dessus:Alternative sans à l'aide de cut2.
ou
Comme l'a souligné @ben-bolker cette divise en largeur plutôt d'occupation.
Je pense que l'utilisation de
quantiles
on peut approximative égale-occupationcut
, lorsqu'il n'est pas donné de façon explicite des points de rupture divise les valeurs dans des bacs de même largeur, ils ne contiennent pas un nombre égal d'éléments en général:Hmisc::cut2
etggplot2::cut_number
utiliser les quantiles, qui est généralement de créer des groupes de même taille (en terme de nombre d'éléments) si les données sont bien répartis et de taille décente, il n'est pas toujours le cas cependant.mltools::bin_data
peut donner des résultats différents, mais il est également basé sur les quantiles.Ces fonctions ne sont pas toujours donner des résultats aussi probants lorsque les données contiennent un petit nombre de valeurs distinctes :
Ce n'est pas clair si la solution optimale a été trouvée ici.
Quel est le meilleur binning approche est subjective, mais d'une façon raisonnable d'approche il est à la recherche pour les bacs à minimiser la variance autour de la prévue dans la corbeille.
La fonction
smart_cut
de (mon) packagecutr
propose cette fonctionnalité. Il est mathématiquement lourde, bien que devrait être réservé aux cas où des points de coupe et des valeurs uniques sont que quelques-uns (qui se trouvent être généralement le cas où c'est important).Nous voyons les groupes sont beaucoup mieux équilibré.
"balanced"
dans l'appel peut en effet être remplacée par une fonction personnalisée pour optimiser ou de restreindre les bacs comme désiré si la méthode basée sur la variance n'est pas suffisant.equal_freq
defunModeling
prend un vecteur et le nombre d'emplacements (basé sur la même fréquence):Vous pouvez également utiliser le
bin
fonction avecmethod = "content"
de laOneR
paquet pour que:Sans paquet supplémentaire, 3 étant le nombre de groupes:
Vous pouvez accélérer le quantile de calcul à l'aide d'un échantillon représentatif des valeurs d'intérêt. Vérifiez la documentation de l'
FindInterval
fonction.Si vous voulez diviser en 3 parts égales distribué des groupes, la réponse est la même que Ben Bolker la réponse ci-dessus - utilisation
ggplot2::cut_number()
. Pour des raisons d'achèvement voici les 3 méthodes de conversion continue à catégorique (binning).cut_number()
: Fait n groupes avec (environ) un nombre égal de l'observationcut_interval()
: Fait n groupes avec la même échellecut_width()
: Fait des groupes de largeur largeurMon go-to est cut_number() car il utilise régulièrement espacés les quantiles de binning observations. Voici un exemple avec des données asymétriques.
Créé sur 2018-11-01 par le reprex paquet (v0.2.1)