fprod.Rdfprod 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.
fprod(x, ...)
# Default S3 method
fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = .op[["na.rm"]],
use.g.names = TRUE, ...)
# S3 method for class 'matrix'
fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = .op[["na.rm"]],
use.g.names = TRUE, drop = TRUE, ...)
# S3 method for class 'data.frame'
fprod(x, g = NULL, w = NULL, TRA = NULL, na.rm = .op[["na.rm"]],
use.g.names = TRUE, drop = TRUE, ...)
# S3 method for class 'grouped_df'
fprod(x, w = NULL, TRA = NULL, na.rm = .op[["na.rm"]],
use.g.names = FALSE, keep.group_vars = TRUE,
keep.w = TRUE, stub = .op[["stub"]], ...)a numeric vector, matrix, data frame or grouped data frame (class 'grouped_df').
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.
a numeric vector of (non-negative) weights, may contain missing values.
an integer or quoted operator indicating the transformation to perform:
0 - "na" | 1 - "fill" | 2 - "replace" | 3 - "-" | 4 - "-+" | 5 - "/" | 6 - "%" | 7 - "+" | 8 - "*" | 9 - "%%" | 10 - "-%%". See TRA.
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.
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.
matrix and data.frame method: Logical. TRUE drops dimensions and returns an atomic vector if g = NULL and TRA = NULL.
grouped_df method: Logical. FALSE removes grouping variables after computation.
grouped_df method: Logical. Retain product of weighting variable after computation (if contained in grouped_df).
character. If keep.w = TRUE and stub = TRUE (default), the weights column is prefixed by "prod.". Users can specify a different prefix through this argument, or set it to FALSE to avoid prefixing.
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.
Non-grouped product computations internally utilize long-doubles in C, for additional numeric precision.
The weighted product is computed as prod(x * w), using a single pass in C. 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.
The (w weighted) product of x, grouped by g, or (if TRA is used) x transformed by its (grouped, weighted) product.
## default vector method
mpg <- mtcars$mpg
fprod(mpg) # Simple product
#> [1] 1.264241e+41
fprod(mpg, w = mtcars$hp) # Weighted product
#> [1] 8.870404e+108
fprod(mpg, TRA = "/") # Simple transformation: Divide by product
#> [1] 1.661076e-40 1.661076e-40 1.803454e-40 1.692716e-40 1.479149e-40
#> [6] 1.431690e-40 1.131114e-40 1.930012e-40 1.803454e-40 1.518698e-40
#> [11] 1.407960e-40 1.297221e-40 1.368410e-40 1.202303e-40 8.226283e-41
#> [16] 8.226283e-41 1.162753e-40 2.562803e-40 2.404606e-40 2.681452e-40
#> [21] 1.700626e-40 1.226032e-40 1.202303e-40 1.052015e-40 1.518698e-40
#> [26] 2.159399e-40 2.056571e-40 2.404606e-40 1.249762e-40 1.558248e-40
#> [31] 1.186483e-40 1.692716e-40
fprod(mpg, mtcars$cyl) # Grouped product
#> 4 6 8
#> 4.204745e+15 1.150054e+09 2.614398e+16
fprod(mpg, mtcars$cyl, mtcars$hp) # Weighted grouped product
#> 4 6 8
#> 3.686893e+36 4.255338e+23 5.653910e+48
fprod(mpg, mtcars[c(2,8:9)]) # More groups..
#> 4.0.1 4.1.0 4.1.1 6.0.1 6.1.0 8.0.0
#> 2.600000e+01 1.196088e+04 1.352082e+10 8.687700e+03 1.323773e+05 1.103122e+14
#> 8.0.1
#> 2.370000e+02
g <- GRP(mtcars, ~ cyl + vs + am) # Precomputing groups gives more speed !
fprod(mpg, g)
#> 4.0.1 4.1.0 4.1.1 6.0.1 6.1.0 8.0.0
#> 2.600000e+01 1.196088e+04 1.352082e+10 8.687700e+03 1.323773e+05 1.103122e+14
#> 8.0.1
#> 2.370000e+02
fprod(mpg, g, TRA = "/") # Groupwise divide by product
#> [1] 2.417211e-03 2.417211e-03 1.686288e-09 1.616591e-04 1.695190e-13
#> [6] 1.367304e-04 1.296321e-13 2.039984e-03 1.906214e-03 1.450400e-04
#> [11] 1.344641e-04 1.486690e-13 1.568277e-13 1.377908e-13 9.427792e-14
#> [16] 9.427792e-14 1.332582e-13 2.396304e-09 2.248384e-09 2.507244e-09
#> [21] 1.797527e-03 1.405104e-13 1.377908e-13 1.205670e-13 1.740515e-13
#> [26] 2.019108e-09 1.000000e+00 2.248384e-09 6.666667e-02 2.267574e-03
#> [31] 6.329114e-02 1.582744e-09
## data.frame method
fprod(mtcars)
#> mpg cyl disp hp drat wt
#> 1.264241e+41 5.163908e+24 2.789968e+73 7.016390e+67 4.366447e+17 3.884021e+15
#> qsec vs am gear carb
#> 9.651882e+39 0.000000e+00 0.000000e+00 7.522960e+17 1.391569e+12
head(fprod(mtcars, TRA = "/"))
#> mpg cyl disp hp
#> Mazda RX4 1.661076e-40 1.161911e-24 5.734833e-72 1.567758e-66
#> Mazda RX4 Wag 1.661076e-40 1.161911e-24 5.734833e-72 1.567758e-66
#> Datsun 710 1.803454e-40 7.746072e-25 3.871012e-72 1.325468e-66
#> Hornet 4 Drive 1.692716e-40 1.161911e-24 9.247418e-72 1.567758e-66
#> Hornet Sportabout 1.479149e-40 1.549214e-24 1.290337e-71 2.494160e-66
#> Valiant 1.431690e-40 1.161911e-24 8.064609e-72 1.496496e-66
#> drat wt qsec vs am gear
#> Mazda RX4 8.931747e-18 6.745586e-16 1.705367e-39 NaN Inf 5.317056e-18
#> Mazda RX4 Wag 8.931747e-18 7.402122e-16 1.763387e-39 NaN Inf 5.317056e-18
#> Datsun 710 8.817237e-18 5.973191e-16 1.928121e-39 Inf Inf 5.317056e-18
#> Hornet 4 Drive 7.053790e-18 8.277504e-16 2.014115e-39 Inf NaN 3.987792e-18
#> Hornet Sportabout 7.214103e-18 8.856800e-16 1.763387e-39 NaN NaN 3.987792e-18
#> Valiant 6.320928e-18 8.908293e-16 2.094928e-39 Inf NaN 3.987792e-18
#> carb
#> Mazda RX4 2.874452e-12
#> Mazda RX4 Wag 2.874452e-12
#> Datsun 710 7.186131e-13
#> Hornet 4 Drive 7.186131e-13
#> Hornet Sportabout 1.437226e-12
#> Valiant 7.186131e-13
fprod(mtcars, g)
#> mpg cyl disp hp drat
#> 4.0.1 2.600000e+01 4 1.203000e+02 9.100000e+01 4.43000
#> 4.1.0 1.196088e+04 64 2.480709e+06 5.713300e+05 53.51976
#> 4.1.1 1.352082e+10 16384 4.158694e+13 1.686524e+13 20659.68036
#> 6.0.1 8.687700e+03 216 3.712000e+06 2.117500e+06 55.06020
#> 6.1.0 1.323773e+05 1296 1.630611e+09 1.747400e+08 130.62669
#> 8.0.0 1.103122e+14 68719476736 3.515354e+30 2.445279e+27 829662.18170
#> 8.0.1 2.370000e+02 64 1.056510e+05 8.844000e+04 14.93880
#> wt qsec vs am gear carb
#> 4.0.1 2.140000e+00 1.670000e+01 0 1 5 2
#> 4.1.0 2.476955e+01 9.164580e+03 1 0 48 4
#> 4.1.1 1.231073e+02 7.933555e+08 1 1 20480 8
#> 6.0.1 2.086503e+01 4.342313e+03 0 1 80 96
#> 6.1.0 1.316358e+02 1.359535e+05 1 0 144 16
#> 8.0.0 1.914897e+07 6.360378e+14 0 0 531441 442368
#> 8.0.1 1.131690e+01 2.117000e+02 0 1 25 32
fprod(mtcars, g, use.g.names = FALSE) # No row-names generated
#> mpg cyl disp hp drat wt
#> 1 2.600000e+01 4 1.203000e+02 9.100000e+01 4.43000 2.140000e+00
#> 2 1.196088e+04 64 2.480709e+06 5.713300e+05 53.51976 2.476955e+01
#> 3 1.352082e+10 16384 4.158694e+13 1.686524e+13 20659.68036 1.231073e+02
#> 4 8.687700e+03 216 3.712000e+06 2.117500e+06 55.06020 2.086503e+01
#> 5 1.323773e+05 1296 1.630611e+09 1.747400e+08 130.62669 1.316358e+02
#> 6 1.103122e+14 68719476736 3.515354e+30 2.445279e+27 829662.18170 1.914897e+07
#> 7 2.370000e+02 64 1.056510e+05 8.844000e+04 14.93880 1.131690e+01
#> qsec vs am gear carb
#> 1 1.670000e+01 0 1 5 2
#> 2 9.164580e+03 1 0 48 4
#> 3 7.933555e+08 1 1 20480 8
#> 4 4.342313e+03 0 1 80 96
#> 5 1.359535e+05 1 0 144 16
#> 6 6.360378e+14 0 0 531441 442368
#> 7 2.117000e+02 0 1 25 32
## matrix method
m <- qM(mtcars)
fprod(m)
#> mpg cyl disp hp drat wt
#> 1.264241e+41 5.163908e+24 2.789968e+73 7.016390e+67 4.366447e+17 3.884021e+15
#> qsec vs am gear carb
#> 9.651882e+39 0.000000e+00 0.000000e+00 7.522960e+17 1.391569e+12
head(fprod(m, TRA = "/"))
#> mpg cyl disp hp
#> Mazda RX4 1.661076e-40 1.161911e-24 5.734833e-72 1.567758e-66
#> Mazda RX4 Wag 1.661076e-40 1.161911e-24 5.734833e-72 1.567758e-66
#> Datsun 710 1.803454e-40 7.746072e-25 3.871012e-72 1.325468e-66
#> Hornet 4 Drive 1.692716e-40 1.161911e-24 9.247418e-72 1.567758e-66
#> Hornet Sportabout 1.479149e-40 1.549214e-24 1.290337e-71 2.494160e-66
#> Valiant 1.431690e-40 1.161911e-24 8.064609e-72 1.496496e-66
#> drat wt qsec vs am gear
#> Mazda RX4 8.931747e-18 6.745586e-16 1.705367e-39 NaN Inf 5.317056e-18
#> Mazda RX4 Wag 8.931747e-18 7.402122e-16 1.763387e-39 NaN Inf 5.317056e-18
#> Datsun 710 8.817237e-18 5.973191e-16 1.928121e-39 Inf Inf 5.317056e-18
#> Hornet 4 Drive 7.053790e-18 8.277504e-16 2.014115e-39 Inf NaN 3.987792e-18
#> Hornet Sportabout 7.214103e-18 8.856800e-16 1.763387e-39 NaN NaN 3.987792e-18
#> Valiant 6.320928e-18 8.908293e-16 2.094928e-39 Inf NaN 3.987792e-18
#> carb
#> Mazda RX4 2.874452e-12
#> Mazda RX4 Wag 2.874452e-12
#> Datsun 710 7.186131e-13
#> Hornet 4 Drive 7.186131e-13
#> Hornet Sportabout 1.437226e-12
#> Valiant 7.186131e-13
fprod(m, g) # etc..
#> mpg cyl disp hp drat
#> 4.0.1 2.600000e+01 4 1.203000e+02 9.100000e+01 4.43000
#> 4.1.0 1.196088e+04 64 2.480709e+06 5.713300e+05 53.51976
#> 4.1.1 1.352082e+10 16384 4.158694e+13 1.686524e+13 20659.68036
#> 6.0.1 8.687700e+03 216 3.712000e+06 2.117500e+06 55.06020
#> 6.1.0 1.323773e+05 1296 1.630611e+09 1.747400e+08 130.62669
#> 8.0.0 1.103122e+14 68719476736 3.515354e+30 2.445279e+27 829662.18170
#> 8.0.1 2.370000e+02 64 1.056510e+05 8.844000e+04 14.93880
#> wt qsec vs am gear carb
#> 4.0.1 2.140000e+00 1.670000e+01 0 1 5 2
#> 4.1.0 2.476955e+01 9.164580e+03 1 0 48 4
#> 4.1.1 1.231073e+02 7.933555e+08 1 1 20480 8
#> 6.0.1 2.086503e+01 4.342313e+03 0 1 80 96
#> 6.1.0 1.316358e+02 1.359535e+05 1 0 144 16
#> 8.0.0 1.914897e+07 6.360378e+14 0 0 531441 442368
#> 8.0.1 1.131690e+01 2.117000e+02 0 1 25 32
## method for grouped data frames - created with dplyr::group_by or fgroup_by
mtcars |> fgroup_by(cyl,vs,am) |> fprod()
#> cyl vs am mpg disp hp drat wt
#> 1 4 0 1 2.600000e+01 1.203000e+02 9.100000e+01 4.43000 2.140000e+00
#> 2 4 1 0 1.196088e+04 2.480709e+06 5.713300e+05 53.51976 2.476955e+01
#> 3 4 1 1 1.352082e+10 4.158694e+13 1.686524e+13 20659.68036 1.231073e+02
#> 4 6 0 1 8.687700e+03 3.712000e+06 2.117500e+06 55.06020 2.086503e+01
#> 5 6 1 0 1.323773e+05 1.630611e+09 1.747400e+08 130.62669 1.316358e+02
#> 6 8 0 0 1.103122e+14 3.515354e+30 2.445279e+27 829662.18170 1.914897e+07
#> 7 8 0 1 2.370000e+02 1.056510e+05 8.844000e+04 14.93880 1.131690e+01
#> qsec gear carb
#> 1 1.670000e+01 5 2
#> 2 9.164580e+03 48 4
#> 3 7.933555e+08 20480 8
#> 4 4.342313e+03 80 96
#> 5 1.359535e+05 144 16
#> 6 6.360378e+14 531441 442368
#> 7 2.117000e+02 25 32
mtcars |> fgroup_by(cyl,vs,am) |> fprod(TRA = "/")
#> cyl vs am mpg disp hp
#> Mazda RX4 6 0 1 2.417211e-03 4.310345e-05 5.194805e-05
#> Mazda RX4 Wag 6 0 1 2.417211e-03 4.310345e-05 5.194805e-05
#> Datsun 710 4 1 1 1.686288e-09 2.596969e-12 5.514301e-12
#> Hornet 4 Drive 6 1 0 1.616591e-04 1.582229e-07 6.295069e-07
#> Hornet Sportabout 8 0 0 1.695190e-13 1.024079e-28 7.156647e-26
#> Valiant 6 1 0 1.367304e-04 1.379851e-07 6.008929e-07
#> Duster 360 8 0 0 1.296321e-13 1.024079e-28 1.001931e-25
#> Merc 240D 4 1 0 2.039984e-03 5.913633e-05 1.085187e-04
#> Merc 230 4 1 0 1.906214e-03 5.675797e-05 1.662787e-04
#> Merc 280 6 1 0 1.450400e-04 1.027836e-07 7.039031e-07
#> Merc 280C 6 1 0 1.344641e-04 1.027836e-07 7.039031e-07
#> Merc 450SE 8 0 0 1.486690e-13 7.845583e-29 7.361123e-26
#> Merc 450SL 8 0 0 1.568277e-13 7.845583e-29 7.361123e-26
#> Merc 450SLC 8 0 0 1.377908e-13 7.845583e-29 7.361123e-26
#> Cadillac Fleetwood 8 0 0 9.427792e-14 1.342681e-28 8.383501e-26
#> Lincoln Continental 8 0 0 9.427792e-14 1.308545e-28 8.792452e-26
#> Chrysler Imperial 8 0 0 1.332582e-13 1.251652e-28 9.405879e-26
#> Fiat 128 4 1 1 2.396304e-09 1.892421e-12 3.913375e-12
#> Honda Civic 4 1 1 2.248384e-09 1.820283e-12 3.083265e-12
#> Toyota Corolla 4 1 1 2.507244e-09 1.709671e-12 3.854082e-12
#> Toyota Corona 4 1 0 1.797527e-03 4.841358e-05 1.697793e-04
#> Dodge Challenger 8 0 0 1.405104e-13 9.046031e-29 6.134269e-26
#> AMC Javelin 8 0 0 1.377908e-13 8.647778e-29 6.134269e-26
#> Camaro Z28 8 0 0 1.205670e-13 9.956324e-29 1.001931e-25
#> Pontiac Firebird 8 0 0 1.740515e-13 1.137866e-28 7.156647e-26
#> Fiat X1-9 4 1 1 2.019108e-09 1.899635e-12 3.913375e-12
#> Porsche 914-2 4 0 1 1.000000e+00 1.000000e+00 1.000000e+00
#> Lotus Europa 4 1 1 2.248384e-09 2.286776e-12 6.700172e-12
#> Ford Pantera L 8 0 1 6.666667e-02 3.322259e-03 2.985075e-03
#> Ferrari Dino 6 0 1 2.267574e-03 3.906250e-05 8.264463e-05
#> Maserati Bora 8 0 1 6.329114e-02 2.849003e-03 3.787879e-03
#> Volvo 142E 4 1 1 1.582744e-09 2.909567e-12 6.462998e-12
#> drat wt qsec gear
#> Mazda RX4 7.083156e-02 1.255690e-01 3.790607e-03 5.000000e-02
#> Mazda RX4 Wag 7.083156e-02 1.377904e-01 3.919570e-03 5.000000e-02
#> Datsun 710 1.863533e-04 1.884534e-02 2.345733e-08 1.953125e-04
#> Hornet 4 Drive 2.357864e-02 2.442345e-02 1.429901e-04 2.083333e-02
#> Hornet Sportabout 3.796726e-06 1.796441e-07 2.675942e-14 5.645029e-06
#> Valiant 2.112891e-02 2.628465e-02 1.487274e-04 2.083333e-02
#> Duster 360 3.869045e-06 1.864330e-07 2.490418e-14 5.645029e-06
#> Merc 240D 6.894650e-02 1.287871e-01 2.182315e-03 8.333333e-02
#> Merc 230 7.324398e-02 1.271723e-01 2.498751e-03 8.333333e-02
#> Merc 280 3.000918e-02 2.613271e-02 1.346049e-04 2.777778e-02
#> Merc 280C 3.000918e-02 2.613271e-02 1.390181e-04 2.777778e-02
#> Merc 450SE 3.700301e-06 2.125441e-07 2.735687e-14 5.645029e-06
#> Merc 450SL 3.700301e-06 1.947886e-07 2.767131e-14 5.645029e-06
#> Merc 450SLC 3.700301e-06 1.973997e-07 2.830021e-14 5.645029e-06
#> Cadillac Fleetwood 3.531558e-06 2.741662e-07 2.826876e-14 5.645029e-06
#> Lincoln Continental 3.615930e-06 2.832529e-07 2.801720e-14 5.645029e-06
#> Chrysler Imperial 3.893151e-06 2.791273e-07 2.738831e-14 5.645029e-06
#> Fiat 128 1.974861e-04 1.787058e-02 2.454133e-08 1.953125e-04
#> Honda Civic 2.386291e-04 1.311863e-02 2.334389e-08 1.953125e-04
#> Toyota Corolla 2.042626e-04 1.490569e-02 2.508333e-08 1.953125e-04
#> Toyota Corona 6.913334e-02 9.951734e-02 2.183406e-03 6.250000e-02
#> Dodge Challenger 3.326655e-06 1.838219e-07 2.652358e-14 5.645029e-06
#> AMC Javelin 3.796726e-06 1.793830e-07 2.719964e-14 5.645029e-06
#> Camaro Z28 4.495806e-06 2.005330e-07 2.422812e-14 5.645029e-06
#> Pontiac Firebird 3.712354e-06 2.007941e-07 2.680658e-14 5.645029e-06
#> Fiat X1-9 1.974861e-04 1.571799e-02 2.382286e-08 1.953125e-04
#> Porsche 914-2 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00
#> Lotus Europa 1.824810e-04 1.229009e-02 2.130193e-08 2.441406e-04
#> Ford Pantera L 2.824859e-01 2.801120e-01 6.849315e-02 2.000000e-01
#> Ferrari Dino 6.574622e-02 1.327580e-01 3.569527e-03 6.250000e-02
#> Maserati Bora 2.369668e-01 3.154574e-01 6.896552e-02 2.000000e-01
#> Volvo 142E 1.989382e-04 2.258192e-02 2.344472e-08 1.953125e-04
#> carb
#> Mazda RX4 4.166667e-02
#> Mazda RX4 Wag 4.166667e-02
#> Datsun 710 1.250000e-01
#> Hornet 4 Drive 6.250000e-02
#> Hornet Sportabout 4.521123e-06
#> Valiant 6.250000e-02
#> Duster 360 9.042245e-06
#> Merc 240D 5.000000e-01
#> Merc 230 5.000000e-01
#> Merc 280 2.500000e-01
#> Merc 280C 2.500000e-01
#> Merc 450SE 6.781684e-06
#> Merc 450SL 6.781684e-06
#> Merc 450SLC 6.781684e-06
#> Cadillac Fleetwood 9.042245e-06
#> Lincoln Continental 9.042245e-06
#> Chrysler Imperial 9.042245e-06
#> Fiat 128 1.250000e-01
#> Honda Civic 2.500000e-01
#> Toyota Corolla 1.250000e-01
#> Toyota Corona 2.500000e-01
#> Dodge Challenger 4.521123e-06
#> AMC Javelin 4.521123e-06
#> Camaro Z28 9.042245e-06
#> Pontiac Firebird 4.521123e-06
#> Fiat X1-9 1.250000e-01
#> Porsche 914-2 1.000000e+00
#> Lotus Europa 2.500000e-01
#> Ford Pantera L 1.250000e-01
#> Ferrari Dino 6.250000e-02
#> Maserati Bora 2.500000e-01
#> Volvo 142E 2.500000e-01
#>
#> Grouped by: cyl, vs, am [7 | 5 (3.8) 1-12]
mtcars |> fgroup_by(cyl,vs,am) |> fselect(mpg) |> fprod()
#> cyl vs am mpg
#> 1 4 0 1 2.600000e+01
#> 2 4 1 0 1.196088e+04
#> 3 4 1 1 1.352082e+10
#> 4 6 0 1 8.687700e+03
#> 5 6 1 0 1.323773e+05
#> 6 8 0 0 1.103122e+14
#> 7 8 0 1 2.370000e+02