On May 12, 2013, at 10:44 AM, David Winsemius wrote: > > On May 12, 2013, at 10:30 AM, arun wrote: > >> Hi, >> According to the error, the variables should have the same length. >> For example: >> set.seed(24) >> dat1<- >> cbind(RACE=sample(1:10,10,replace=TRUE),as.data.frame(matrix(sample(1:100,20*10,replace=TRUE),ncol=20))) >> lapply(dat1[,-1],function(x) >> CrossTable(x,dat1$RACE,format="SPSS",prop.chisq=FALSE,digits=2,dnn=c("VAR","RACE"))) >> # prints cross tables. >> >> #or >> lapply(names(dat1)[-1],function(x) >> CrossTable(dat1[,x],dat1[,"RACE"],format="SPSS",prop.chisq=FALSE,digits=2,dnn=c(x,"RACE"))) >> A.K. >>> Hi, >>> >>> I have 20 variables in a data frame (VAR1 ... VAR20) which I would like to >>> crosstab against the variable RACE. >>> I would like to use a loop structure instead of 20 statements like: >>> CrossTable(VAR1, RACE, format = "SPSS", prop.chisq = FALSE, digits = 2) >>> >>> >>> I have tried following syntax, but failed: >>> >>> library(gmodels) >>> for(i in 1:20){ >>> columnname <- ("VAR",i) >>> CrossTable(columnname, RACE, format = "SPSS", prop.chisq = FALSE, digits = >>> 2) >>> } >>> >>> I receive following Error: >>> Error in CrossTable(columnname, RACE, format = "SPSS", prop.chisq = FALSE, >>> : >>> x and y must have the same length > > It might be productive in learning R to understand what you were doing wrong > and how you could have used that control for-loop structure. It does appear > that you have `attach`-ed a data.frame and are referring to the column names. > Yes? If so, you should realize that is not a particularly safe practice, but > let's push on. > > columnname is just a character vector with a single element, "VAR1" the > first time around. R does not do a double-evaluation to first figure out that > `columnname` is "VAR1" and then proceed further to look up its value. To do > that you would need to add `get`: > > for(i in 1:20){ > columnname <- ("VAR",i) > CrossTable( get(columnname), RACE, format = "SPSS", prop.chisq = FALSE, > digits = 2) > } > > The get function does the extra step of converting the character value to an > object name and returning the value of that named data-object. > >>> Any idea how to get 20 crosstables within a loop? > > That should do it. It would have been better if you had used dput() to > produce a workable small example of a few of the columns.
(I probably should have made it clear that the "you" I was addressing was Stefan, whose message has not yet shown up on my mail-client but to whom Arun was responding to the list. I see a lot of messages from Arun that are responses to messages that never make it to the list. I guessed (correctly) he was replying to Nabble postings that are blocked because of the filters on the Nabble-spam-conduit. So in this case the original message may never make it to the archives, because I just cleared the moderation queue of a single spam message and did not see the original posting.) Actually that single revision to the argument to CrossTable won't do it. When I built my own data example, I also find that Stefan failed to properly construct `columnname` using paste0 and didn't do anything with the value of CrossTable. Since for() is a function, the value needs to either be printed or saved as something. res<-list() for(i in 1:3){ columnname <- paste0("VAR",i) res[[i]] <- CrossTable( get(columnname), RACE, format = "SPSS", prop.chisq = FALSE, digits = 2) } res[[1]] Cell Contents |-------------------------| | Count | | Row Percent | | Column Percent | | Total Percent | |-------------------------| Total Observations in Table: 10 | RACE get(columnname) | 1 | 2 | 3 | Row Total | ----------------|-----------|-----------|-----------|-----------| 3 | 0 | 0 | 1 | 1 | | 0.00% | 0.00% | 100.00% | 10.00% | | 0.00% | 0.00% | 20.00% | | | 0.00% | 0.00% | 10.00% | | ----------------|-----------|-----------|-----------|-----------| 4 | 0 | 0 | 2 | 2 | | 0.00% | 0.00% | 100.00% | 20.00% | | 0.00% | 0.00% | 40.00% | | | 0.00% | 0.00% | 20.00% | | ----------------|-----------|-----------|-----------|-----------| 7 | 0 | 0 | 1 | 1 | | 0.00% | 0.00% | 100.00% | 10.00% | ---- snipped rest of output. > > David Winsemius > Alameda, CA, USA > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. David Winsemius Alameda, CA, USA ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.