Thanks to everyone who helped me solve this question. My cleanest solution is:
joint.and.marginals <- function(x,y) { t <- addmargins(table(x, y)) rownames(t)[nrow(t)] <- deparse(substitute(y)) colnames(t)[ncol(t)] <- deparse(substitute(x)) return(t) } There are many other valid solutions, but this one struck me as being the simplest. As a demo of it's use: > D <- data.frame(f1=sample(1:5,10000,replace=T), f2=sample(1:5,10000,replace=T) > system.time(print(joint.and.marginals(D$f1, D$f2))) y x 1 2 3 4 5 D$f1 1 420 427 385 376 423 2031 2 425 432 429 375 347 2008 3 405 419 434 401 352 2011 4 374 374 370 417 403 1938 5 403 381 409 388 431 2012 D$f2 2027 2033 2027 1957 1956 10000 [1] 0.05 0.00 0.07 0.00 0.00 Hmm, how would one get rid of the 'x' and 'y' that are occuring in the table? :-) -ans. ______________________________________________ [EMAIL PROTECTED] mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html