0
votes

Implémentation de boucles for dans R

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.

r

0 commentaires

4 Réponses :


0
votes

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


2 commentaires

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.



0
votes

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


0 commentaires

0
votes

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


3 commentaires

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



0
votes

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:

  • Réduire ('*', c (...)) -> multiplier tous les éléments de la collection c (...)
  • setdiff (some_vector, 0) -> exclut la valeur 0 du vecteur donné
  • myVector (-j) -> renvoie tous les éléments du vecteur à l'exception du jème élément

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)))
}


0 commentaires