2017-09-20 3 views
0

j'ai un deux données de niveau (niveau de l'hôpital et au niveau de la région), chaque hôpital a un joint unique: e:générer q1/q3 comme variables selon le groupe de R

hospid zipid o:e 
    1  1 0.8 
    2  1 0.5 
    3  1 0.4 
    4  2 0.9 
    5  2 1.2 
    6  2 1.5 

Je veux générer les 25% quantiles et 75% quantiles de o: e par zipid, de sorte que la sortie serait comme ceci:

hospid zipid o:e q1 q3 
    1  1 0.8 0.9 1.05 
    2  1 0.5 0.9 1.05 
    3  1 0.4 0.9 1.05 
    4  2 0.9 1.0 1.10 
    5  2 1.2 1.0 1.10 
    6  2 1.5 1.0 1.10 

J'ai trouvé un code R qui peut montrer les quantiles exacts, mais ne savez pas comment extraire ces valeurs et générer de nouvelles variables basées sur ces valeurs.

do.call("rbind", tapply(data$oe, data$zipid, quantile)) 
      0%  25%  50%  75%  100% 
region1 0.93  0.99  1.02  1.04 1.11 
region2 0.54  0.92  1.02  1.07 1.16 

Une suggestion? Merci!

Répondre

2
df$q1 = ave(df$o.e, df$zipid, FUN = function(x) quantile(x)[2]) 
df$q3 = ave(df$o.e, df$zipid, FUN = function(x) quantile(x)[4]) 
df 
# hospid zipid o.e q1 q3 
#1  1  1 0.8 0.45 0.65 
#2  2  1 0.5 0.45 0.65 
#3  3  1 0.4 0.45 0.65 
#4  4  2 0.9 1.05 1.35 
#5  5  2 1.2 1.05 1.35 
#6  6  2 1.5 1.05 1.35 

DONNÉES

df = structure(list(hospid = 1:6, zipid = c(1L, 1L, 1L, 2L, 2L, 2L 
), o.e = c(0.8, 0.5, 0.4, 0.9, 1.2, 1.5), q1 = c(0.45, 0.45, 
0.45, 1.05, 1.05, 1.05), q3 = c(0.65, 0.65, 0.65, 1.35, 1.35, 
1.35)), .Names = c("hospid", "zipid", "o.e", "q1", "q3"), row.names = c(NA, 
-6L), class = "data.frame") 
+1

Je pense qu'il est préférable d'avoir 'df [c ("q1", "q3")] <- lapply (c (2, 4), fonction (i) avec (df, ave (oe, zipid, FUN = fonction (x) quantile (x) [i]))) 'dans votre réponse. Je vais supprimer cette partie – akrun

1

Nous pouvons utiliser data.table pour créer les colonnes

library(data.table) 
setDT(df)[, c('q1', 'q3') := as.list(quantile(o.e)[c(2, 4)]), zipid] 
df 
# hospid zipid o.e q1 q3 
#1:  1  1 0.8 0.45 0.65 
#2:  2  1 0.5 0.45 0.65 
#3:  3  1 0.4 0.45 0.65 
#4:  4  2 0.9 1.05 1.35 
#5:  5  2 1.2 1.05 1.35 
#6:  6  2 1.5 1.05 1.35