[R] Loop for CrossTable (gmodels)

David Winsemius dwinsemius at comcast.net
Sun May 12 19:44:43 CEST 2013

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.

David Winsemius
Alameda, CA, USA

More information about the R-help mailing list