# The following prints a truncated tabulation with truncated labels. tab.all <- function(datfr, maxnval=10, sort.by.freq=F, maxnchar=30, file=NULL, nsep=30, width=72) { if(!is.null(file)) sink(file) # Divert to a file if non-null, else print to the terminal. options(width=width) datfr <- as.data.frame(datfr) N <- nrow(datfr) tabs <- lapply(datfr, table, exclude=NULL) nvals <- sapply(tabs, length) nvals.f <- format(nvals) cat(rep("_",nsep),"\n",sep="") for(i in 1:ncol(datfr)) { # tab <- table(datfr[,i], exclude=NULL) tab <- tabs[[i]] sel.na <- is.na(names(tab)) # Strip NA frequency. Glue back later. if(any(sel.na)) { na <- tab[sel.na]; tab <- tab[!sel.na] } else { na <- NULL } nval <- length(tab) cat("Variable ",format(c(N,i))[-1],": #values = ",nvals.f[i]," ", colnames(datfr)[i],"\n",sep="") if(!any(is.na(as.numeric(names(tab))))) names(tab) <- format(as.numeric(names(tab))) names(tab) <- substring(names(tab),1,maxnchar) # Truncate long labels. if(sort.by.freq) { # Sort by descending frequency ord <- order(tab, rev(names(tab)), decreasing=T) tab <- tab[ord] if(nval>maxnval) { tab <- c(tab[1:maxnval],'(Rest)'=sum(tab[(maxnval+1):nval]),na) } else { tab <- c(tab,na) } } else { ord <- order(names(tab)) tab <- tab[ord] sel1 <- 1:(maxnval/2); sel2 <- nval+1-((maxnval/2):1) if(nval>maxnval) { tab <- c(tab[sel1],'(Rest)'=sum(tab[-c(sel1,sel2)]),tab[sel2],na) } else { tab <- c(tab,na) } } ## tab.v <- c(" Values:",names(tab)) ## tab.f <- c(" Counts:",c(tab)) ## tab.t <- format(c(tab.v,tab.f), justify="right") ## tab.v <- tab.t[1:length(tab.v)] ## tab.f <- tab.t[1:length(tab.v)+length(tab.v)] tab <- rbind(" Counts:"=tab) colnames(tab) <- format(colnames(tab), justify="right") print(tab) ## cat(tab.v,"\n",sep="") ## cat(tab.f,"\n",sep="") cat(rep("_",nsep),"\n",sep="") } if(!is.null(file)) sink() # End diversion to file. } # End function tab.all()