2013-09-22 7 views
0

J'ai une liste de blocs de données appelée: mylist. En-têtes de la liste des noms de personnes et les trames de données contiennent des colonnes avec des données associées à ces noms (date, taille, poids, etc.)Boxplot avec une boucle for

names(mylist[1]) 
[1] "John" 
names(mylist[2]) 
[1] "Susan" 


mylist[[1]] 
[1] name date hight weight .... 
    John 1950 1.81 78 
    John 1948 1.60 60 
    John 1935 1.50 55 

mylist[[2]] 
[1] name date hight weight .... 
    Susan 1985 1.40 40 . 
    Susan 1995 1.45 60 
    Susan 1990 1.25 40 

Je veux créer une boîte à moustaches pour chacun des paramètres: un boxplot pour la taille, un pour le poids, etc. Et je veux inclure juste dans le boxplot de chaque mesure toutes les informations de personnes. Par exemple, je veux une boîte à moustache pour la hauteur qui contient les informations de John, Susan, etc.

Voici ma tentative pour la boucle, mais cela ne fonctionne pas.

for(s in 3:21) { 
boxplot(x=for(i in 1:99){ mylist[[i]][s]})) 
} 

Salut les gars, j'ai appliqué la solution de nograpes. Bien que, le code qu'il a suggéré:

ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free') 

piles chaque boxplot dessus de l'autre et, enfin, la parcelle est illisible car il y a 16 boxplots. Ainsi, une bonne idée est de créer 16 boxplots différents, un pour chaque métrique.

J'ai cherché des solutions pour cela et on est d'exécuter ce code:

tomelt<-data.frame(c(daily[1],daily[2],daily[3])) #create a data.frame with variable name, date and the variable to be ploted. 

melted.df<-melt(tomelt,id.vars=c('name', 'date')) #convert to long form 
ggplot(melted.df,aes(x=name,y=value)) + geom_boxplot() #plot 

16 fois, changeant à chaque fois le code pour appeler une autre mesure (colonne) de la trame de données ... mais évidemment que ce n'est pas efficace du tout.

Avez-vous une idée sur la façon de créer une boucle for pour cela?

+0

Il serait utile que vous nous avez donné la sortie de 'dput (mylist)' afin que nous puissions simplement couper et coller vos données dans nos sessions. – nograpes

+0

Merci nograpes! Le problème est que les données sont hughe! il a 16 métriques et plus de 50.000 observations. – user2794659

+1

Eh bien, il y a une [bonne FAQ] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) qui vous montre quelques techniques sur la façon de réduire vos données pour des questions. Mais, brièvement, vous pouvez utiliser 'dput (head (mylist))' et cela ne nous donnera que les six premiers de votre liste. – nograpes

Répondre

0

Il y a beaucoup de choses que vous semblez manquer ici. Premièrement, il semble que si vous avez 16 mesures et 50 000 observations, avec 10 observations par personne, vous obtiendrez 80 000 boîtes à moustaches. Peut-être que vous étiez intéressé par seulement les premières personnes ou quelque chose.

Vous avez beaucoup à apprendre sur les boucles for. Vous devriez certainement prendre un guide sur R et essayer quelques autres choses de base en premier.

Avec la boucle, je pense que vous aviez l'intention de faire quelque chose comme ceci:

for(s in 3:ncol(mylist[[1]])) { 
    for(i in 1:length(mylist)){ 
    boxplot(mylist[[i]][s]) 
    } 
} 

Mais même cela ne fonctionnerait pas, chaque parcelle écraserait le dernier, donc vous devez le mettre en une grille avec par(mfrow=c(num.rows,num.cols)). Mais il existe de bien meilleures options. Vous devriez regarder ?boxplot, en particulier les exemples; il y a beaucoup d'exemples qui s'appliquent à votre situation. En outre, considérez ggplot2. Par exemple, essayez ce code, qui tracera vos données soigneusement dans les lignes et les colonnes sans boucles.

# Stick your list together. 
one.df<-do.call(rbind,mylist) 
# Convert to "long-form". 
library(reshape) 
melted.df<-melt(one.df,id.vars=c('name','date')) 
# Plot with ggplot2 
ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free') 

enter image description here

+0

Salut, nograpes! Merci pour la réponse! J'ai essayé le code pour ggplot2 plot, mais il dit "Erreur dans layout_base (données, lignes, drop = drop): Au moins une couche doit contenir toutes les variables utilisées pour facettage" – user2794659

0

J'ai récemment fait cela. J'ai une trame de données, et je veux tracer les colonnes 3 à 10 comme l'axe des ordonnées dans chacun des 8 boîtes à moustaches par rapport à la colonne 1. La df est appelée "Événement". Vous devez faire une nouvelle trame de données (« de boxdf ») à chaque fois avec les mêmes colnames, qui est boiteux, mais il fonctionne:

for (g in 3:ncol(Event)) 
    { 
     SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png") 
     boxdf <- data.frame(Event$event_type,Event[g]) 
     colnames(boxdf) = c("event_type","ycol") 
     boxplot(ycol~event_type,data=boxdf, main = colnames(Event[g]), xlab="type: 0:non-event, 1:event", ylab=colnames(Event[g]),col=c("blue","red")) #Event[g] 
     dev.copy(png,SaveBox) 
     dev.off() 
     rm(boxdf) 
    } 

Oh, il permet aussi d'économiser chaque boxplot dans le répertoire courant. Les lignes sont sauver:

SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png") 
... 
dev.copy(png,SaveBox) 
      dev.off() 
+0

Initialement, j'ai essayé de simplement se référer à l'axe des y comme as.name (colnames (Event [g])) comme dans: boxplot (as.name (colnames (Event [g])) ~ event_type, data = Event ...) mais cela n'a pas fonctionné. – Gecko17k