Я думаю, что это достаточно обрабатывается с помощью векторизованной версии if / else:
ifelse(runif(length(t)) < 0.5, xt1, xt2)
Предостережение: это прекрасно работает в большинстве случаев. Тем не менее, ifelse
может иметь побочные эффекты. Это работает нормально, сохраняя класс POSIXt
:
Sys.time() + ifelse(runif(3) < 0.5, 0, 100)
# [1] "2018-10-29 12:54:08 PDT" "2018-10-29 12:54:08 PDT" "2018-10-29 12:54:08 PDT"
Но если вы работаете с векторами уже классов, этот класс может быть потерян:
ifelse(runif(3) < 0.5, Sys.time(), Sys.time() + 100)
# [1] 1540842742 1540842842 1540842842
Есть обходные пути для этого, но иногда их лучше классифицировать как «хаки». И вы не можете использовать их, если не понимаете, что вам нужно их искать. (Это обычно не имеет значения, если вектор просто numeric
, integer
, logical
или character
, и я уверен, что некоторые другие одинаково "хороши".)