Rev 4110 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# SCCS @(#)ratetable.s 5.2 09/25/98## This is a 'specials' function for pyears# it is a stripped down version of as.matrix(data.frame(...))# There is no function to create a ratetable.# This function has a class, only so that data frame subscripting will work#ratetable <- function(...) {args <- list(...)nargs <- length(args)ll <- sapply(args, length)n <- max(ll)levlist <- vector("list", nargs)x <- matrix(0,n,nargs)dimnames(x) <- list(1:n, names(args))for (i in 1:nargs) {if (ll[i] ==n) {if (!is.numeric(args[[i]])) args[[i]] <- factor(args[[i]])if (is.factor(args[[i]])) {levlist[[i]] <- levels(args[[i]])x[,i] <- c(args[[i]])}else x[,i] <- args[[i]]}else if (ll[i] ==1) levlist[i] <- args[i]else stop("All arguments to ratetable() must be the same length")}attr(x, "constants") <- (ll==1) & (n>1)attr(x, "levlist") <- levlistclass(x) <- "ratetable2"x}# The two functions below should only be called internally, when missing# values cause model.frame to drop some rowsis.na.ratetable2 <- function(x) {attributes(x) <- list(dim=dim(x))as.vector((1 * is.na(x)) %*% rep(1, ncol(x)) >0)}"[.ratetable2" <- function(x, rows, cols, drop=FALSE) {if (!missing(cols)) {stop("This should never be called!")}aa <- attributes(x)attributes(x) <- aa[c("dim", "dimnames")]y <- x[rows,,drop=FALSE]attr(y,'constants') <- aa$constantsattr(y,'levlist') <- aa$levlistclass(y) <- 'ratetable2'y}## Functions to manipulate rate tables#"[.ratetable" <- function(x, ..., drop=TRUE) {aa <- attributes(x)attributes(x) <- aa[c("dim", "dimnames")]y <- NextMethod("[", drop=FALSE)newdim <- attr(y, 'dim')if (is.null(newdim)) stop("Invalid subscript")dropped <- (newdim==1)if (drop) change <- (newdim!=aa$dim & !dropped)else change <- (newdim!=aa$dim)if (any(change)) { #dims that got smaller, but not droppednewcut <- aa$cutpointsfor (i in (1:length(change))[change])if (!is.null(newcut[[i]])) newcut[[i]] <-(newcut[[i]])[match(dimnames(y)[[i]], aa$dimnames[[i]])]aa$cutpoints <- newcut}if (drop && any(dropped)){if (all(dropped)) as.numeric(y) #single elementelse {#Note that we have to drop the summary functionattributes(y) <- list( dim = dim(y)[!dropped],dimnames = dimnames(y)[!dropped],dimid = aa$dimid[!dropped],factor = aa$factor[!dropped],cutpoints =aa$cutpoints[!dropped])class(y) <- 'ratetable'y}}else {aa$dim <- aa$dimnames <- NULLattributes(y) <- c(attributes(y), aa)y}}is.na.ratetable <- function(x)structure(is.na(as.vector(x)), dim=dim(x), dimnames=dimnames(x))Math.ratetable <- function(x, ...) {attributes(x) <- attributes(x)[c("dim", "dimnames")]NextMethod(.Generic)}Ops.ratetable <- function(e1, e2) {#just treat it as an arrayif (nchar(.Method[1])) attributes(e1) <- attributes(e1)[c("dim","dimnames")]if (nchar(.Method[2])) attributes(e2) <- attributes(e2)[c("dim","dimnames")]NextMethod(.Generic)}as.matrix.ratetable <- function(x, ...) {attributes(x) <- attributes(x)[c("dim", "dimnames")]x}print.ratetable <- function(x, ...) {cat ("Rate table with dimension(s):", attr(x, 'dimid'), "\n")attributes(x) <- attributes(x)[c("dim", "dimnames")]NextMethod()}