餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

ifelse()と論理値の掛け算

Rでは論理値TRUEとFALSEは、それぞれ1と0として演算する事ができます。ゆえにyとzがxの値に関わらず計算可能な値になるのであれば、ifelse()の代わりに論理値で演算を行う事ができます。
ifelse()はベクター演算にならないので、論理値を使う方が速いです。実際に以下の例では、ifelse()が0.71秒、論理値が0.07秒になっており、10倍ぐらいの速度差がありました。

num = 1000000
x = round(runif(num, 0, 1))
y = 1:num
z = rep(c(1,2,3,4,5),num/5)
gc();gc();system.time({ sum*1 })

*1:x==1)*y + (x!=1)*z) }) gc();gc();system.time({ sum(ifelse(x==1, y, z