Dividing selected columns by vector in dplyr

You can use Map

df1[-1] <- Map(`/`, df1[-1], df2)

# A tibble: 5 x 4
#      x    a1    a2    a3
#  <dbl> <dbl> <dbl> <dbl>
#1    19 0.333     4   0.4
#2    38 0.667     8   0.8
#3    57 1        12   1.2
#4    76 1.33     16   1.6
#5    95 1.67     20   2  

Or if you want a tidyverse solution you can use map2 in purrr :

df1[-1] <- purrr::map2(df1[-1], df2, `/`)

You can use rowwise() with c_across()

df1 %>%
  rowwise() %>% 
  mutate(c_across(a1:a3) / df2, .keep = "unused") %>%
  ungroup()

# # A tibble: 5 x 4
#       x    b1    b2    b3
#   <dbl> <dbl> <dbl> <dbl>
# 1    19 0.333     4   0.4
# 2    38 0.667     8   0.8
# 3    57 1        12   1.2
# 4    76 1.33     16   1.6
# 5    95 1.67     20   2  

Another base R option

df1[-1] <- t(t(df1[-1]) / unlist(df2))
df1

# # A tibble: 5 x 4
#       x    a1    a2    a3
#   <dbl> <dbl> <dbl> <dbl>
# 1    19 0.333     4   0.4
# 2    38 0.667     8   0.8
# 3    57 1        12   1.2
# 4    76 1.33     16   1.6
# 5    95 1.67     20   2  

One solution could be:

bind_cols(select(df1, x),
          sweep(select(df1, -x), 2, FUN = `/`, unlist(df2)))

      x    a1    a2    a3
  <dbl> <dbl> <dbl> <dbl>
1    19 0.333     4   0.4
2    38 0.667     8   0.8
3    57 1        12   1.2
4    76 1.33     16   1.6
5    95 1.67     20   2  

Tags:

R

Dplyr