2010-06-25 33 views
2

J'ai un dataframe qui ressemble à ceci:R: lattice.qq Comment est-ce que je fais une parcelle de traitement multi-panel [x] vs contrôle?

str(Data) 
'data.frame': 11520 obs. of 29 variables: 
$ groupname : Factor w/ 8 levels "Control","Treatment1",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ fCycle  : Factor w/ 2 levels "Dark","Light": 2 2 2 2 2 2 2 2 2 2 ... 
$ totdist : num 0 67.5 89.8 109.1 58.3 ... 
#etc. 

je peux faire une seule parcelle de traitement1 vs contrôle comme celui-ci:

qq(groupname~totdist|fCycle, data=Data, 
subset=(groupname=='Control'|groupname=='Treatment1')) 

Il ressemble à ceci:

alt text

Je voudrais faire automatiquement des parcelles similaires de Treatment2 vs Control ... TreatmentX vs Control. Est-ce l'endroit pour une boucle ou est-ce que le treillis a un meilleur moyen?

Répondre

1

Pour faire cela sur un seul panneau, il faut réorganiser. Tout d'abord, je vais générer un ensemble d'échantillons de données avec le même genre de structure que le vôtre

library(lattice) 
Data <- data.frame(groupname = factor(rep(c('Control',paste('Treatment',1:7,sep='')),each = 100)), 
        fCycle = factor(rep(rep(c('Dark','Light'),each = 50),8)), 
        totdist = sample(unlist(iris),800,replace = TRUE)) 

Ensuite, ajoutez une variable pour établir une distinction entre le traitement et le contrôle (c.-à-"Treatment2" est recodé comme "Treatment", etc.)

Data$groupname2 <- factor(gsub('[1-9]','',as.character(Data$groupname))) 

réarranger Ensuite, l'ensemble de données de telle sorte que chaque groupe de traitement reçoit une copie des données de contrôle

Data2 <- NULL 
for(treat in paste('Treatment',1:7,sep='')){ 
    Data2 <- rbind(Data2, 
       cbind(rbind(Data[Data$groupname == treat,],Data[Data$groupname == 'Control',]), 
         treat)) 
} 

Enfin, nous pouvons faire la désiré graphique

qq(groupname2~totdist|fCycle*treat, data=Data2) 

Si vous voulez des parcelles séparées pour chaque traitement, puis une boucle serait mieux

pdf('treatVsContQq.pdf') 
for(treat in paste('Treatment',1:7,sep='')){ 
    print(qq(groupname~totdist|fCycle, data=Data, 
    subset=(groupname=='Control'|groupname==treat))) 
} 
dev.off() 
+0

Merci pour l'explication détaillée. Il semble qu'une boucle sera la solution la plus simple compte tenu des autres choses que je fais avec l'ensemble de données. – dnagirl