R: Fast (Grouped, Weighted) Product for Matrix-Like Objects

fprod {collapse} | R Documentation

## Fast (Grouped, Weighted) Product for Matrix-Like Objects

### Description

`fprod` is a generic function that computes the (column-wise) product of all values in `x`, (optionally) grouped by `g` and/or weighted by `w`. The `TRA` argument can further be used to transform `x` using its (grouped, weighted) product.

### Usage

    fprod(x, ...)

    ## Default S3 method:
    fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = TRUE,
          use.g.names = TRUE, ...)

    ## S3 method for class 'matrix'
    fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = TRUE,
          use.g.names = TRUE, drop = TRUE, ...)

    ## S3 method for class 'data.frame'
    fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = TRUE,
          use.g.names = TRUE, drop = TRUE, ...)

    ## S3 method for class 'grouped_df'
    fprod(x, w = NULL, TRA = NULL, na.rm = TRUE,
          use.g.names = FALSE, keep.group_vars = TRUE, keep.w = TRUE, ...)

### Arguments

`x` | a numeric vector, matrix, data frame or grouped data frame (class 'grouped_df').
`g` | a factor, `GRP` object, atomic vector (internally converted to factor) or a list of vectors / factors (internally converted to a `GRP` object) used to group `x`.
`w` | a numeric vector of (non-negative) weights, may contain missing values.
`TRA` | an integer or quoted operator indicating the transformation to perform: 0 - "replace_NA" | 1 - "replace_fill" | 2 - "replace" | 3 - "-" | 4 - "-+" | 5 - "/" | 6 - "%" | 7 - "+" | 8 - "*" | 9 - "%%" | 10 - "-%%". See `TRA`.
`na.rm` | logical. Skip missing values in `x`. Defaults to `TRUE` and implemented at very little computational cost. If `na.rm = FALSE` a `NA` is returned when encountered.
`use.g.names` | logical. Make group-names and add to the result as names (default method) or row-names (matrix and data frame methods). No row-names are generated for data.table's.
`drop` | matrix and data.frame method: Logical. `TRUE` drops dimensions and returns an atomic vector if `g = NULL` and `TRA = NULL`.
`keep.group_vars` | grouped_df method: Logical. `FALSE` removes grouping variables after computation.
`keep.w` | grouped_df method: Logical. Retain product of weighting variable after computation (if contained in `grouped_df`).
`...` | arguments to be passed to or from other methods. If `TRA` is used, passing `set = TRUE` will transform data by reference and return the result invisibly.

### Details

Non-grouped product computations internally utilize long-doubles in C++, for additional numeric precision.

The weighted product is computed as `prod(x * w)`. If `na.rm = TRUE`, missing values will be removed from both `x` and `w` i.e. utilizing only `x[complete.cases(x,w)]` and `w[complete.cases(x,w)]`.

For further computational details see `fsum`, which works equivalently.

### Value

The (`w` weighted) product of `x`, grouped by `g`, or (if `TRA` is used) `x` transformed by its (grouped, weighted) product.

### See Also

`fsum`, Fast Statistical Functions, Collapse Overview

### Examples

    ## default vector method
    mpg <- mtcars$mpg
    fprod(mpg)                         # Simple product
    fprod(mpg, w = mtcars$hp)          # Weighted product
    fprod(mpg, TRA = "/")              # Simple transformation: Divide by product
    fprod(mpg, mtcars$cyl)             # Grouped product
    fprod(mpg, mtcars$cyl, mtcars$hp)  # Weighted grouped product
    fprod(mpg, mtcars[c(2,8:9)])       # More groups..
    g <- GRP(mtcars, ~ cyl + vs + am)  # Precomputing groups gives more speed !
    fprod(mpg, g)
    fprod(mpg, g, TRA = "/")           # Groupwise divide by product

    ## data.frame method
    fprod(mtcars)
    head(fprod(mtcars, TRA = "/"))
    fprod(mtcars, g)
    fprod(mtcars, g, use.g.names = FALSE) # No row-names generated

    ## matrix method
    m <- qM(mtcars)
    fprod(m)
    head(fprod(m, TRA = "/"))
    fprod(m, g) # etc..

    ## method for grouped data frames - created with dplyr::group_by or fgroup_by
    library(dplyr)
    mtcars %>% group_by(cyl,vs,am) %>% fprod(hp)   # Weighted grouped product
    mtcars %>% fgroup_by(cyl,vs,am) %>% fprod(hp)  # Equivalent and faster
    mtcars %>% fgroup_by(cyl,vs,am) %>% fprod(TRA = "/")
    mtcars %>% fgroup_by(cyl,vs,am) %>% fselect(mpg) %>% fprod()

[Package collapse version 1.8.6 Index]