Pour développer la réponse de dwin, et votre commentaire, juste garder une trace du 0
et rajoutez dans les réponses triviales:
## Dummy data
set.seed(1)
a <- sample(0:10, 100, replace = TRUE)
b <- runif(100)
## something to hold results
out <- numeric(length(a))
## the computations you *want* to do
want <- !a==0
## fill in the wanted answers
out[want] <- a[want] * exp(b[want])
Ce qui donne les bons résultats:
> all.equal(out, a * exp(b))
[1] TRUE
Si vous le souhaitez, vous pouvez envelopper dans une fonction:
myFun <- function(a, b) {
out <- numeric(length(a))
want <- !a==0
out[want] <- a[want] * exp(b[want])
return(out)
}
T poule utilisent
> all.equal(out, myFun(a, b))
[1] TRUE
Mais rien de tout cela est plus efficace que d'utiliser a * exp(b)
directement. Les deux *
et exp()
sont vectorisés, donc fonctionnera très rapidement, beaucoup plus rapidement que l'une des mesures de tenue de réservation utilisées dans les diverses réponses jusqu'à présent. Si vous avez besoin de solutions de comptabilité, cela dépendra du coût de votre fonction (exp()
dans l'exemple de votre Q) en termes de calcul. Essayez les deux approches sur un petit échantillon et évaluez les temps (en utilisant system.time()
) pour voir si cela vaut la peine de faire l'effort supplémentaire de faire le sous-ensemble pour suivre le 0.
-1 pour traiter b comme zéro. +1 pour note sur l'efficacité d'exécution. sum = 0. –
Je ne peux pas vous mettre en colère maintenant, après avoir joué avec les boutons de vote avant. Faites un petit montage et puis je peux. –