John Fox helped show me how to collapse the categories, pooling
frequencies, in an n-way table, using levels()<- on an equivalent
data frame:
# create a table
sex <- c("Male", "Female")
age <- letters[1:6]
education <- c("low", 'med', 'high')
data <- expand.grid(sex=sex, age=age, education=education)
counts <- rpois(36, 100)
data <- cbind(data, counts)
t1 <- xtabs(counts ~ sex + age + education, data=data)
# collapse age to 3 levels
levels(data$age) <- c("A", "A", "B",
"B", "C", "C")
t2 <- xtabs(counts ~ sex + age + education, data=data)
mosaicplot(t2,shade=T)
I'd like to generalize this to a function, collapse.table. Here's what
I tried:
collapse.table <- function(table, ...) {
nargs <- length(args <- list(...))
if (!nargs)
return(table)
if (inherits(table, "table")) {
table <- as.data.frame.table(table)
freq <- table[,"Freq"]
tvars <- dimnames(table)
}
names <- names(args)
print(cat("names: ", names, "\n"))
for (i in 1:nargs) {
vals <- args[[i]]
nm <- names[[i]]
print(cat("vals: ", vals, "\n"))
print(cat("nm: ", nm, "\n"))
levels(table$nm) <- vals
}
terms <- paste(tvars, sep = '+')
result <- xtabs(freq ~ terms, data=table)
}
>From the output below, I see what the problem is, but don't know
how to fix it:
> collapse.table(t1, age=c("A", "A", "B",
"B", "C", "C"))
names: age
NULL
vals: A A B B C C
NULL
nm: age
NULL
Error in "levels<-.default"(*tmp*, value = c("A",
"A", "B", "B", "C", :
attempt to set an attribute on NULL> traceback()
3: "levels<-.default"(*tmp*, value = c("A",
"A", "B", "B", "C",
"C"))
2: "levels<-"(*tmp*, value = c("A", "A",
"B", "B", "C", "C"))
1: collapse.table(t1, age = c("A", "A", "B",
"B", "C", "C"))
Can someone help?
-Michael
--
Michael Friendly friendly at yorku.ca
York University http://www.math.yorku.ca/SCS/friendly.html
Psychology Department
4700 Keele Street Tel: (416) 736-5115 x66249
Toronto, Ontario, M3J 1P3 Fax: (416) 736-5814
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._