[R] Labeling charts within a loop

Peter Dalgaard p.dalgaard at biostat.ku.dk
Tue Nov 30 01:32:24 CET 2004

"Doran, Harold" <HDoran at air.org> writes:

> Hi All:
> This may turn out to be very simply, but I can't seem to add the name of
> the school to a chart. The loop I created is below that subsets a
> dataframe and creates a chart for each school based on certain
> variables. As it stands now, they title includes the school's ID number.
> Instead, I want to replace this with the school's actual name, which is
> stored in a variable called schname.
> But so far, my attempts have been messy and ugly? Can anyone see a
> mistake in my code?

No overt mistakes, but multiple infelicities. Don't listen to guys who
want to create sequences of variable names, it is (almost) invariably
the wrong idea.

> #This portion of code takes the subset
> school.list<-as.vector(unique(mansfield.dat$schirn))
> for(school.number in school.list){
> assign(paste("school", school.number, sep=""),
> subset(mansfield.dat,mansfield.dat$schirn==school.number))}

Lessee, that was basically

byschool <- split(mansfield.dat, mansfield.dat$schirn) 

below, you use only 4 variables from the data frame and under
different names, so maybe first extract and rename them and have

# code should be executable from here on

vars <- c("bpra3ccf", "bprr3ccf", "bprl3ccf", "bpri3ccf")
d2 <- mansfield.dat[vars]
names(d2) <- c("AV", "RP", "LT", "IT")
byschool <- split(d2, mansfield.dat$schirn)

# now to get the averages, you can do

mnList <- lapply(byschool, colMeans)

# now, let's do a little function to do one of your plots. It will have
# three arguments, the mean vector, the number of the school, and the
# name of the school

doPlot <- function(mn, no, name)
   # (I won't argue with your filename scheme)
   pdf(file=paste("school", no, "rel.pdf", sep="")
   # The barplot should get the names right automagically now:
   barplot(mn, width=c(.5,.5,.5,.5), ylim = c(0, 4), col=("salmon"))
   legend(1.0,3.8,legend=c("1=Relative Weakness", 
                "2=Similar to District", "3=Relative Strength"))
   title(main=(paste("Grade 3 Relative Strengths and Weaknesses", "\n",
      "School:", name, sep="")))

# All set, now

num <- names(mnList)
mapply(doPlot, mnList, num, schname[num])

# done! End executable code

Obviously, not having your data, all the above is untested, and most
likely not entirely bugfree.

> for(school.number in school.list){
> AV<-mean(get(paste("school",school.number,sep=""))[["bpra3ccf"]])
> RP<-mean(get(paste("school",school.number,sep=""))[["bprr3ccf"]])
> LT<-mean(get(paste("school",school.number,sep=""))[["bprl3ccf"]])
> IT<-mean(get(paste("school",school.number,sep=""))[["bpri3ccf"]])
> strengthbar<-cbind(AV,RP,LT,IT)
> pdf(paste("school",school.number,"rel", ".pdf",sep=""))
> barplot(strengthbar,names=c("AV", "RP", "LT",
> "IT"),width=c(.5,.5,.5,.5),ylim = c(0, 4),col=("salmon"))
> legend(1.0,3.8,legend=c("1=Relative Weakness", "2=Similar to District",
> "3=Relative Strength"))
> title(main=(paste("Grade 3 Relative Strengths and Weaknesses", "\n",
> "School ", school.number,sep="")))
> dev.off()
> }

   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907

More information about the R-help mailing list