'Can you implement 'sweep' using apply in R?

I'm brushing up on my R skills and finally feel like I've mastered the strange sweep function e.g.

df <- data.frame(a = 1:3, b = 2:4)
sweep(df, MARGIN = 2, STATS = c(5, 10), FUN = "*")

##    a  b
## 1  5 20
## 2 10 30
## 3 15 40

and more usefully here, on a tutorial I'm working on implementing a spatial interaction model in R.

They say that a sign you understand something is that you can say it in many ways, and I think this applies more in programming than almost anywhere else. Yet, despite the problem that sweep solves seeming apply-esque, I have NO IDEA whether they are to some degree interchangeable.

So, in order to improve my own understanding of R, is there any way to do the above procedure using apply?



Solution 1:[1]

As an additional information, since questions about sweep are recurring, quick benchmarking gives (on Intel i7-8700 with Windows)

x <- matrix(data = 20000*5000, nrow = 20000, ncol = 5000)
system.time(expr = {
  aa <- colMeans(x = x)
  bb <- sweep(x = x, MARGIN = 2, STATS = aa, FUN = "-")
})
#        user      system      elapsed
#        4.69        0.16        4.84 
system.time(expr = {
  bbb <- apply(X = x, MARGIN = 1, FUN = function(z) z - mean(x = z))
  bbb <- t(x = bbb)
})
#        user      system      elapsed
#        6.28        0.55        6.85 

Meaning that sweep is more efficient when applicable.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Comevussor