2011-10-12 4 views
1

Disons que j'ai deux listes:listes Joining puis faire boxplots

temp<-c("con.sin.results","sin.results","exp.results") 
Temp<-c("[,1:16]","[,17:32]","[,33:48]","[,49:64]") 

Chacune des variables température contiennent 1000 observations et 64 variables. Ce que j'essaye de faire est de créer une double boucle afin que je puisse créer des boxplots basés sur la taille de l'échantillon (de sorte que chaque boxplot aurait 16 cases, comme Temp), c'est-à-dire que j'obtiendrais boxplot (con.sin.results [, 01:16]), puis boxplot (con.sin.results [17: 32]), etc.

Avec cet objectif à l'esprit, je suis devenu le point suivant:

for (l in temp){ 
for (L in Temp){ 
windows() 
par(mfrow=c(2,2)) 
A<-noquote(paste(noquote(l),noquote(L),sep="")) 
boxplot(A) 
} 
} 

Malheureusement , ceci crache une erreur à moi:

Erreur dans x [étage (d)] + x [plafond (d)]: argument non numérique à binaire opérateur

Où est-ce que je me trompe? Que devrais-je ajuster?

+0

Vous ne pouvez pas simplement coller des chaînes ensemble et attendre leur exécution, même avec 'noquote'. À l'heure actuelle "temp" est un vecteur de caractère avec trois éléments. S'il vous plaît lire ceci: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610 –

+0

Non, je m'en rends compte. Je suppose que c'était plus une question en rapport avec la façon dont vous pourriez obtenir cette chaîne à exécuter. – Albort

Répondre

2

Si je comprends bien votre question, ce qui est plus ou moins ce que vous voulez:

bplotforone<-function(mat, groups=list(1:16, 17:32, 33:48, 49:64), newwin=TRUE, mfrow=c(2,2)) 
{ 
    nr<-nrow(mat) 
    if(newwin) windows() 
    par(mfrow=mfrow) 
    for(curgroup in groups) 
    { 
     newres<-as.vector(mat[,curgroup]) 
     newres<-data.frame(vals=newres, grp=rep(seq_along(curgroup), each=nr)) 
     boxplot(vals~grp, data=newres) 
    } 
} 

con.sin.results2<-matrix(runif(10*64), ncol=64) #generated some test data here 
bplotforone(con.sin.results2) 

Vous pouvez maintenant facilement faire quelque chose comme:

listOfResults<-list(con.sin.results,sin.results,exp.results) #note: no quotes!! 
for(curres in listOfResults) bplotforone(curres) 
+0

Nice. Je l'aime beaucoup. Mon superviseur a proposé une approche différente. Ah la joie de programmer. – Albort

1

C'est ce que mon superviseur est venu avec :

temp<-c("con.sin.results","sin.results","exp.results") 
N<-c(50,100,250,500) 
con.sin.results<-matrix(runif(100*64),100,64) 
sin.results<-matrix(runif(100*64),100,64) 
exp.results<-matrix(runif(100*64),100,64) 

for (I in temp){ 
    windows() 
    par(mfrow=c(2,2)) 
    for (n in N){ 
    if (n==50) eval(parse(text=paste("boxplot(",I,"[,1:16])",sep=""))) 
    if (n==100) eval(parse(text=paste("boxplot(",I,"[,17:32])",sep=""))) 
    if (n==250) eval(parse(text=paste("boxplot(",I,"[,33:48])",sep=""))) 
    if (n==500) eval(parse(text=paste("boxplot(",I,"[,49:64])",sep=""))) 
    } 
} 
+0

'fortune (" repenser ")' (installe le paquet 'fortunes' et exécute la commande précédente) –