R/By.R

Defines functions By.data.frame By.default By

Documented in By

By <- function(formula,expr,data=parent.frame()) UseMethod("By",data)

By.default <- function(formula,expr,data=parent.frame()){
  m <- match.call()
  parent <- parent.frame()
  expr <- m$expr
  formula <- m$formula
  if(is.environment(data)){
    allVars <- union(all.vars(formula),all.vars(expr))
    data <- lapply(allVars,function(v)get(v,envir=data))
    names(data) <- allVars
  }
  data <- as.data.frame(data)
  fun <- function(x) eval(expr,data[x,],parent)
  factors <- all.vars(formula)
  factors <- data[factors]
  nd <- nrow(data)
  ans <- eval(substitute(tapply(1:nd, factors, fun)), data)
  ans.is.nonnull <- !sapply(ans,is.null)
  if(!all(ans.is.nonnull)){
    ans <- if(is.matrix(ans)) ans[,ans.is.nonnull]
           else ans[ans.is.nonnull]
  }
  attr(ans, "call") <- match.call()
  class(ans) <- "by"
  ans
}

By.data.frame <- function(formula,expr,data){
  m <- match.call()
  parent <- parent.frame()
  expr <- m$expr
  formula <- m$formula
  if(is.environment(data)){
    allVars <- union(all.vars(formula),all.vars(expr))
    data <- lapply(allVars,function(v)get(v,envir=data))
    names(data) <- allVars
  }
  fun <- function(x) {
    xdata <- data[x,,drop=FALSE]
    res <- eval(expr,xdata,parent)
    if(is.list(res) && length(res[["data"]]) && is.environment(res[["data"]]))
      res[["data"]] <- xdata
    res
    }
  factors <- all.vars(formula)
  factors <- data[factors]
  nd <- nrow(data)
  ans <- eval(substitute(tapply(1:nd, factors, fun)), data)
  ans.is.nonnull <- !sapply(ans,is.null)
  if(!all(ans.is.nonnull)){
    ans <- if(is.matrix(ans)) ans[,ans.is.nonnull]
           else ans[ans.is.nonnull]
  }
  attr(ans, "call") <- match.call()
  class(ans) <- "by"
  ans
}

Try the memisc package in your browser

Any scripts or data that you put into this service are public.

memisc documentation built on March 31, 2023, 7:29 p.m.