[QUESTION] Looking for an elegant way to update values in a tibble based on conditional filtering

See the FAQ: How to do a minimal reproducible example reprex for beginners to attract more specific answers.

d <- data.frame(
  id = 1:6,
  mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1), cyl = c(6, 6, 4, 6, 8, 6), 
  disp = c(160, 160, 108, 258, 360, 225),
  hp = c(110, 110, 93, 110, 175, 105), 
  drat = c(3.9, 3.9,3.85, 3.08, 3.15, 2.76),
  wt = c(2.62, 2.875, 2.32, 3.215, 3.44,3.46),
  qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22),
  vs = c( 0,0, 1, 1, 0, 1), 
  am = c(1, 1, 1, 0, 0, 0), 
  gear = c(4, 4, 4, 3,3, 3),
  carb = c(4, 4, 1, 1, 2, 1))

d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1  1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

# change mpg for id 1 to 22.0 (row1,col1)
d[1,1] <- 22
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# change disp for id1 and id2 to 180
d[1:2,4] <- 180
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# change all carb to 4
d[12] <- 4
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    4
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    4
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    4
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    4
# change all gear to 4
d$gear <- 4
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    4
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    4    4
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    4    4
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    4    4
# change id4 hp and drat
d[3,5:6] <- c(100,3.9)
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  1    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  1    4    4
#> 3  3 22.8   4  108 100 3.90 2.320 18.61  1  1    4    4
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    4    4
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    4    4
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    4    4
# change any am 1 to am 0
d[which(d$am == 1),"am"] <- 0
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  0    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  0    4    4
#> 3  3 22.8   4  108 100 3.90 2.320 18.61  1  0    4    4
#> 4  4 21.4   6  258 110 3.08 3.215 19.44  1  0    4    4
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    4    4
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    4    4
# change qsec to 20 if vs == 1 and hp > 105
d[which(d$vs == 1 & d$hp > 105),8] <- 20
d
#>   id  mpg cyl disp  hp drat    wt  qsec vs am gear carb
#> 1 22 21.0   6  180 110 3.90 2.620 16.46  0  0    4    4
#> 2  2 21.0   6  180 110 3.90 2.875 17.02  0  0    4    4
#> 3  3 22.8   4  108 100 3.90 2.320 18.61  1  0    4    4
#> 4  4 21.4   6  258 110 3.08 3.215 20.00  1  0    4    4
#> 5  5 18.7   8  360 175 3.15 3.440 17.02  0  0    4    4
#> 6  6 18.1   6  225 105 2.76 3.460 20.22  1  0    4    4

Created on 2023-06-12 with reprex v2.0.2