Search code examples
rdataframedata-manipulationmultiplication

Multiply without eliminate information


I have a dataframe and I would like to maintain information. My data frame is like:

a <- c("a","b", "c", "d")
b <- c("e","f", "g", "h")
c <- c(1, 2, 1, 3) # multiply
d <- c("AB","BC", "CD", "DE")
e <- c(7, 5, 4, 3)
f<- c(2, 3, 5, 4)
g<- c(5, 7, 7, 9)
h <- c(6, 1, 2, 10)
m <- data.frame(a, b, d, e, f, g, h, c)

I would like to change e and f with the multiply of c * e ... c * h. How can I do it automatically without writing every single column?


Solution

  • With across:

    library(dplyr)
    mutate(m, across(c(e, f), ~ .x * c))
    #mutate(m, across(c(e, f), `*`, c))
      a b  d  e  f c
    1 a e AB  7  2 1
    2 b f BC 10  6 2
    3 c g CD  4  5 1
    4 d h DE  9 12 3
    

    or if you wanna keep the original columns:

    mutate(m, across(c(e, f), ~ .x * c, .names = "new_{.col}"))
    
      a b  d  e  f c new_e new_f
    1 a e AB  7  2 1     7     2
    2 b f BC 10  6 2    20    12
    3 c g CD  4  5 1     4     5
    4 d h DE  9 12 3    27    36
    

    or in base R

    m[c(4,5)] <- sapply(m[c(4,5)], \(x) c*x)
    # or even simpler (as pointed out by @zx8754 in the comments)
    #m[, 4:5] <- m[, 4:5] * m$c 
    

    if you wanna keep the original columns:

    m[paste0("new_", c("e", "f"))] <- sapply(m[c(4,5)], \(x) c*x)
    #m[paste0("new_", c("e", "f"))] <- m[, 4:5] * m$c