R: Groupwise scaling and centering of numeric columns in a...

scaleBy {doBy} | R Documentation

## Groupwise scaling and centering of numeric columns in a dataframe

### Description

Groupwise scaling and centering of numeric columns in a dataframe. Obtained by first splitting a dataframe and then calling scale on each stratum.

### Usage

    scaleBy(formula, data, center = TRUE, scale = TRUE, details=0)

### Arguments

`formula` | Either a two-sided formula or a list. A dot (.) is allowed on both left and right hand side of formula. See 'details' for the meaning of this.
`data` | A dataframe
`center` | If TRUE then data is centered to have mean zero
`scale` | If TRUE then data is scaled to have variance one
`details` | If larger than zero then information about grouping etc. is printed.

### Details

A typical formula is `y1+y2~f1+f2` where y1 and y2 are numeric variables and f1 and f2 can be of any type. For each cross-combination of the values of f1 and f2, the variables (y1,y2) are centered/scaled.

It is valid to write `.~f1+f2`. In this case the variables to be centered/scaled are taken to be all numeric variables in the dataframe except those that a listed on the right hand side of the formula.

It is valid to write `y1+y2~.`. In this case the stratification is taken to be by all non-numeric variables. If there are no non-numeric variables, then no stratification is made and a 'global' centering/scaling is made.

It is valid to write `.~.`. In this case the variables to be centered/scaled are taken to be all numeric variables in the dataframe. The stratification is made by all non-numeric variables. If there are no non-numeric variables, then no stratification is made and a 'global' centering/scaling is made.

### Value

A dataframe with the same columns as the input dataframe, but the scaled / centered values are put into the relevant columns.

### Author(s)

Søren Højsgaard, sorenh@math.aau.dk

### See Also

`lapplyBy`, `orderBy`, `splitBy`, `summaryBy`, `transformBy`,

### Examples

    ## The following forms are equivalent:
    scaleBy(conc+rate ~ state, data=Puromycin)
    scaleBy(list(c("conc","rate"), "state"), data=Puromycin)
    scaleBy(list(c("."), "."), data=Puromycin)
    scaleBy(.~., data=Puromycin)

    ## The same results can be obtained from
    lapply(splitBy(~state, data=Puromycin),
    	function(.dd) scale(.dd[,sapply(Puromycin,class)=="numeric"]))

    ## The pig growth data 'dietox'
    data(dietox)

    # "Remove the effect of time" by centering data within each time point.
    dietox2 <- scaleBy(Weight~Time, data=dietox, scale=FALSE)

    ## Not run:
    library(lattice)
    xyplot(Weight~Time|Evit+Cu, groups=Pig, data=dietox)
    xyplot(Weight~Time|Evit+Cu, groups=Pig, data=dietox2)

    ## End(Not run)

[Package doBy version 4.5-15 Index]