subtract a constant vector from each row in a matrix in r

前端 未结 5 1768
终归单人心
终归单人心 2020-12-14 00:36

I have a matrix with 5 columns and 4 rows. I also have a vector with 3 columns. I want to subtract the values in the vector from columns 3,4 and 5 respectively at each row o

5条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-14 01:22

    This can be done with the rray package in a very satisfying way (using its (numpy-like) broadcasting - operator %b-%):

    #install.packages("rray")
    library(rray)
    
    b <- matrix(rep(1:20), nrow=4, ncol=5)
    x <- c(5, 6, 7)
    
    b[, 3:5] <- b[, 3:5] %b-% matrix(x, 1)
    b
    #>      [,1] [,2] [,3] [,4] [,5]
    #> [1,]    1    5    4    7   10
    #> [2,]    2    6    5    8   11
    #> [3,]    3    7    6    9   12
    #> [4,]    4    8    7   10   13
    

    For large matrices this is even faster than sweep:

    #install.packages("bench")
    res <- bench::press(
      size = c(10, 1000, 10000),
      frac_selected = c(0.1, 0.5, 1),
      {
      B <- matrix(sample(size*size), nrow=size, ncol=size)
      B2 <- B
      x <- sample(size, size=ceiling(size*frac_selected))
      idx <- sample(size, size=ceiling(size*frac_selected))
    
      bench::mark(rray = {B2[, idx] <- B[, idx, drop = FALSE] %b-% matrix(x, nrow = 1); B2}, 
                  sweep = {B2[, idx] <- sweep(B[, idx, drop = FALSE], MARGIN = 2, x); B2}
      )
      }
    )
    plot(res)
    

提交回复
热议问题