Вот подход с недавно выпущенной функциональностью across
(версия >= 1.0.0
):
mymtcars %>%
rownames_to_column("car") %>%
mutate(across(c(disp, hp, drat),
~ if_else(mpg > 20 & cyl == 6, NA_real_, as.numeric(.))))
# car mpg cyl disp hp drat wt qsec vs am gear carb
#1 Mazda RX4 21 6 NA NA NA 2.6 16 0 1 4 4
#2 Mazda RX4 Wag 21 6 NA NA NA 2.9 17 0 1 4 4
#3 Datsun 710 23 4 108 93 3.9 2.3 19 1 1 4 1
#4 Hornet 4 Drive 21 6 NA NA NA 3.2 19 1 0 3 1
#5 Hornet Sportabout 19 8 360 175 3.1 3.4 17 0 0 3 2
#6 Valiant 18 6 225 105 2.8 3.5 20 1 0 3 1
Самая сложная часть здесь заключается в том, что некоторые столбцы являются двойными, а некоторые - целыми числами, поэтому у вас есть сделать что-то, чтобы убедиться, что оба типа столбцов могут обрабатываться одной и той же функцией.
Пример данных
mymtcars <- structure(list(mpg = c(21L, 21L, 23L, 21L, 19L, 18L), cyl = c(6L,
6L, 4L, 6L, 8L, 6L), disp = c(160L, 160L, 108L, 258L, 360L, 225L
), hp = c(110L, 110L, 93L, 110L, 175L, 105L), drat = c(3.9, 3.9,
3.9, 3.1, 3.1, 2.8), wt = c(2.6, 2.9, 2.3, 3.2, 3.4, 3.5), qsec = c(16L,
17L, 19L, 19L, 17L, 20L), vs = c(0L, 0L, 1L, 1L, 0L, 1L), am = c(1L,
1L, 1L, 0L, 0L, 0L), gear = c(4L, 4L, 4L, 3L, 3L, 3L), carb = c(4L,
4L, 1L, 1L, 2L, 1L)), class = "data.frame", row.names = c("Mazda RX4",
"Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", "Hornet Sportabout",
"Valiant"))