Вы можете использовать
(x > 25) * (10 * x)
#[1] 0 0 300 400
Чтобы сломать это
(x > 25) #gives
#[1] FALSE FALSE TRUE TRUE
(10 * x)
#[1] 100 200 300 400
Теперь, когда вы умножаете это вместе FALSE
оценивается в 0, тогда как TRUE
в 1. Таким образом, числа больше 25 умножаются на 10, тогда как меньше чем 25 умножаются на 0.
В качестве альтернативы ifelse
мы также можем использовать replace
replace(x * 10, x <= 25, 0)
#[1] 0 0 300 400
Бенчмаркинг по длине 1e6
данные
set.seed(1234)
x <- sample(1:50, 1e6, replace = TRUE)
library(microbenchmark)
microbenchmark(mul = (x > 25) * (10 * x),
ifelse = ifelse(x>25, x*10, 0),
replace = replace(x * 10, x <= 25, 0))
Unit: milliseconds
# expr min lq mean median uq max neval cld
# mul 6.654335 12.74489 15.93877 14.22821 15.03979 70.48483 100 a
# ifelse 89.945089 112.12242 126.15313 120.03759 135.84350 432.44697 100 c
#replace 11.711879 18.30549 27.78782 20.75061 21.96056 395.21573 100 b
В случае, если мы хотим сохранить x
как есть и изменить только на x > 25
, мы можем сделать
c(1, 10)[(x > 25) + 1] * x
#[1] 10 20 300 400