J'ai actuellement stocké mes valeurs dans un vecteur
0.5 * (1-0.6) * (0.1) * (0.2)
Je veux parcourir ce vecteur et pour chaque j multiplier le reste des membres (tant qu'ils ne sont pas 0) * (1-myVector [j])
Donc par exemple si j était à la deuxième position, je voudrais faire:
myVector [1] 0.5 0.6 0.0 0.1 0.2 0.0
Ma première fois à travailler avec R, donc tous les conseils seront utiles.
4 Réponses :
Vous pouvez le faire avec la boucle for
comme:
myVector <- c(0.5, 0.6, 0.0, 0.1, 0.2, 0.0) myNewVec <- myVector[myVector != 0] result <- numeric(length(myNewVec)) for(i in seq_along(myNewVec)) { result[i] <- (1 - myNewVec[i]) * prod(myNewVec[-i]) } result #[1] 0.006 0.004 0.054 0.024
Si vous ne voulez pas sortir pour 0 valeurs:
myVector <- c(0.5, 0.6, 0.0, 0.1, 0.2, 0.0) result <- numeric(length(myVector)) for(i in seq_along(myVector)) { result[i] <- (1 - myVector[i]) * prod(replace(myVector[-i], myVector[-i] == 0, 1)) } result #[1] 0.006 0.004 0.006 0.054 0.024 0.006
salut, j'obtiens une erreur inattendue ',' pour la virgule dans cette ligne (== 0, 1))
Êtes-vous sûr de copier le code de mon message tel quel? Cela fonctionne pour moi sans aucune erreur avec les données de mon message. Je supprime de l'espace supplémentaire dans la réponse pour voir si cela change quelque chose.
Est-ce que ça marche:
for(j in seq_along(v[v>0])){ print((1-v[v>0][j]) * Reduce(`*`,v[v>0][-j])) } [1] 0.006 [1] 0.004 [1] 0.054 [1] 0.024
Vous pouvez également le faire avec la famille de fonctions apply pour boucler sur chaque valeur et prod
pour obtenir le produit de chaque valeur.
sapply(seq_along(vec), function (i) prod( vec[-c(which(vec == 0), i)], 1 - vec[i]))
Modifier: si vous souhaitez parcourir l'index, vous pouvez effectuer les opérations suivantes.
vec <- c(0.5, 0.6, 0.0, 0.1, 0.2, 0.0) sapply(vec, function(x) prod( vec[!(vec %in% c(0, x))], (1-x) ) ) #[1] 0.006 0.004 0.006 0.054 0.024 0.006
Ne fonctionnera pas s'il y a des valeurs dupliquées dans vec. Vous devrez supprimer par index plutôt que par correspondance.
Salut, je n'ai pas besoin de considérer les cas où vec [j] vaut 0. Il ne devrait donc y avoir que 4 valeurs en sortie
@ 27ϕ9 vous avez raison, ne fonctionne pas avec les doublons
La solution courte:
myVector = myVector = c(0.5, 0.6, 0.0, 0.1, 0.2, 0.0) # input > output [1] 0.006 0.004 0.006 0.054 0.024 0.006
L'explication:
Donc, pour le vecteur ci-dessous, la sortie est:
output = NULL for (j in 1:length(myVector)){ output[j] = Reduce('*',c((1-myVector[j]),setdiff(myVector[-j],0))) }