7 mapreduce()
Base R has functionals that output a list by way of lapply() and Map() (among others), while Reduce() diminishes given elements in a consecutive manner until a single result remains. While these functions are relatively straightforward to combine (depending on the functions being passed), R does not inherently possess a singular function to accomplish this operation unlike Julia with mapreduce()8. Therefore, mapreduce() in afp offers a simplified Julia-equivalent to streamline the intended procedure in R.
The three required parameters are f, o, and x (“fox,”
collectively)–function, (binary) operator, and collection (e.g. matrix). If f is multivariate, the fourth parameter y can take multiple arguments much like MoreArgs in mapply(). The final parameter ... passes to Reduce(). The output is typically a matrix, depending on the inputs and functions being passed.
7.0.1 Map and Reduce
# GOAL: Map a function to each matrix and then reduce them by a binary operator.
matrixl <- list(A = matrix(c(1:9), 3, 3),
B = matrix(10:18, 3, 3),
C = matrix(19:27, 3, 3))
## Univariate case
output1 <- mapreduce(function(x) x^2 + 1, `/`, matrixl)
output1 ## == Reduce(`/`, Map(function(x) x^2 + 1, matrixl))## [,1] [,2] [,3]
## [1,] 0.0000547016 0.0002061856 0.0003107868
## [2,] 0.0001022035 0.0002490183 0.0003310752
## [3,] 0.0001560306 0.0002837380 0.0003456270
## Multivariate case
output2 <- with(matrixl,
mapreduce(function(i, j, k) i*j - k,
`/`,
A,
list(B, C)))
output2## [,1] [,2] [,3]
## [1,] -1.387799e-10 -3.408547e-12 -3.442132e-13
## [2,] -2.925642e-11 -1.456427e-12 -1.839155e-13
## [3,] -9.059628e-12 -6.829299e-13 -1.031438e-13
7.1 mrchop()
The function mrchop() has similar properties to mapreduce(): it applies the latter row-wise or column-wise, which can be specified.
The four required parameters are f, o, x, and m–function, (binary) operator, collection (e.g. matrix), and margin (either 1 for row-wise or 2 for column-wise). The fifth, optional parameter ... passes to mapreduce(), which passes to Reduce(). The output is typically a matrix, depending on the inputs and functions being passed.
7.1.1 Map and Reduce Column/Row-wise
## Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
## 164.4900 164.8975 129.7900 213.0675
## Hornet Sportabout Valiant Duster 360 Merc 240D
## 295.1550 192.7700 328.4600 135.4900
## Merc 230 Merc 280 Merc 280C Merc 450SE
## 149.7850 175.2300 174.8300 255.3700
## Merc 450SL Merc 450SLC Cadillac Fleetwood Lincoln Continental
## 255.7500 254.9250 364.2800 363.3220
## Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla
## 362.8475 106.9250 97.5825 103.4775
## Toyota Corona Dodge Challenger AMC Javelin Camaro Z28
## 136.8875 259.8250 253.0425 323.1400
## Pontiac Firebird Fiat X1-9 Porsche 914-2 Lotus Europa
## 315.5875 104.1075 136.2850 136.8415
## Ford Pantera L Ferrari Dino Maserati Bora Volvo 142E
## 335.3450 189.7950 347.3550 144.4450
## mpg cyl disp hp drat wt qsec vs
## 321.450 99.000 3691.550 2347.000 57.545 51.476 285.580 7.000
## am gear carb
## 6.500 59.000 45.000
7.2 reducechop()
The function reducechop() has similar properties to mrchop(): it applies Reduce() row-wise or column-wise, which can be specified.
7.2.1 Reduce Column/Row-wise
## Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
## 328.980 329.795 259.580 426.135
## Hornet Sportabout Valiant Duster 360 Merc 240D
## 590.310 385.540 656.920 270.980
## Merc 230 Merc 280 Merc 280C Merc 450SE
## 299.570 350.460 349.660 510.740
## Merc 450SL Merc 450SLC Cadillac Fleetwood Lincoln Continental
## 511.500 509.850 728.560 726.644
## Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla
## 725.695 213.850 195.165 206.955
## Toyota Corona Dodge Challenger AMC Javelin Camaro Z28
## 273.775 519.650 506.085 646.280
## Pontiac Firebird Fiat X1-9 Porsche 914-2 Lotus Europa
## 631.175 208.215 272.570 273.683
## Ford Pantera L Ferrari Dino Maserati Bora Volvo 142E
## 670.690 379.590 694.710 288.890
## mpg cyl disp hp drat wt qsec vs
## 642.900 198.000 7383.100 4694.000 115.090 102.952 571.160 14.000
## am gear carb
## 13.000 118.000 90.000