2017-06-26 1 views
0

En général, je veux obtenir le quintile supérieur d'une trame de données de la distribution d'une colonne. Cependant, il doit être le quintile supérieur pour chaque valeur catégorielle unique d'une autre colonne.Les quintiles supérieurs pour plusieurs valeurs catégorielles

Je suppose que cela doit être fait en plusieurs étapes, potentiellement avec une boucle. Au début, je dois séparer les trames de données en fonction des valeurs catégorielles uniques, puis ne conserver que les quintiles supérieurs de chaque nouvelle trame de données, puis relier les trames de données ensemble. Mais je n'ai aucune idée de comment faire cela.

Certaines données de l'échantillon:

dat <- data.frame(x = rep(letters[1:3],times = 5), 
        y = rep(1:3,each = 5)) 
    > dat 
    x y 
1 a 1 
2 b 1 
3 c 1 
4 a 1 
5 b 1 
6 c 2 
7 a 2 
8 b 2 
9 c 2 
10 a 2 
11 b 3 
12 c 3 
13 a 3 
14 b 3 
15 c 3 

À l'étape 1 Je veux créer une trame de données pour chaque valeur catégorique unique. Quelque chose comme:

> df.a 
    x y 
    1 a 1 
    2 a 1 
    3 a 2 
    4 a 2 
    5 a 3 

DF.B et df.c en conséquence

Dans la deuxième étape, je veux seulement garder le quintile supérieur de chaque nouvelle trame de données. Quelque chose comme:

deviendrais ceci:

> df.a=df.a[df.a$y > quantile(df.a, 0.5, na.rm = TRUE),] 
    # taking the top 50% because the top quintile would not work with the sample data. 

Dans la dernière étape, je dois rbind toutes les nouvelles trames de données.

Répondre

1

Comme vous l'avez noté, vos données d'échantillon rendent difficile l'utilisation de quintiles, donc je modifierai légèrement vos données d'échantillon.

## New data 
dat <- data.frame(x = rep(letters[1:3],times = 25), 
        y = sample(10, 75, replace=TRUE)) 

Il ne faut pas faire data.frames séparés pour chaque valeur de la variable catégorique, afin d'obtenir les quintiles. Vous pouvez le faire avec aggregate.

Limits = aggregate(dat$y, list(dat$x), quantile, 0.8) 
row.names(Limits) = Limits[,1] 
(Limits = Limits [,-1, drop=FALSE]) 
    x 
a 8.0 
b 7.2 
c 8.0 

Maintenant, ayant la table (en haut) quintiles par catégorie, nous pouvons simplement sélectionner cette partie des données d'origine qui est au-dessus de ces quintiles (par catégorie).

TopQuintile = dat[which(dat$y >= Limits[dat$x,1]), ]