erreur "valeur manquante là où TRUE / FALSE est requis"

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 14:40

Bonjour à tous,

Pourriez-vous m'éclairer par rapport à ce message d'erreur? Sachant que j'ai bien une situation où i=0, i-1=0 et i-12=0

Code : Tout sélectionner

a=c(0,0,0,0,0,0,0,1,0,0,0,0,
    0,0,0,0,0,0,0,1,0,0,0,0,
    0,0,0,0,0,0,0,1,0,0,0,0,
    0,0,0,0,0,0,0,1,0,0,0,0,
    1,1,1,1,1,1,1,1,1,1,1,1,
    0,0,0,1,0,0,0,0,0,1,0,0,
    0,0,0,1,0,0,0,0,0,1,0,0,
    0,0,0,1,1,1,1,1,1,1,0,0,
    0,0,0,1,0,0,0,0,0,1,1,1,
    0,0,0,1,0,0,0,0,0,1,0,0,
    0,0,0,1,0,0,0,0,0,1,0,0)

b=data.frame(a)


group1<- function(x) {
  g0 <- 1
  v<-c(13L,25L,37L,49L,61L,73L,85L,97L,109L,121L)
  v2<-c(2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L)
  for (i in seq.int(g)) {
    g[i] <-
      if (x[i] == 0 && i==1L) {
        g[i]<-g0
      } else if (x[i]==0 && i%in%v && x[i-12]==1) {
        g[i]<-g0 <- g0 +1
      } else if (x[i]==0 && x[i-1]==1 && i%in%v2) {
        g[i]<-g0 <- g0 +1
      } else if (x[i]==0 && x[i-1]==1 && x[i-12]==1) {
        g[i]<- g0 <- g0 +1
      } else if (x[i]==0 && i%in%v && x[i-12]==0) {
        g[i]<-g0 <- g[i-12]
      } else if (x[i]==0 && x[i-1]==1 && x[i-12]==0) {
        g[i]<- g0 <- g[i-12]
      } else if (x[i]==0 && x[i-1]==0 && i%in%v2){
        g[i]<-g0 <- g[i-1]
      } else if (x[i]==0 && x[i-1]==0 && x[i-12]==1){
        g[i]<-g0 <- g[i-1]
      } else if (x[i]==0 && x[i-1]==0 && x[i-12]==0){
        g[i]<- g0 <- g[i-1]
      } else {
        g[i]<- g0 <- "bord"
      }
  }
  g
}

b$group=group1(b$a)


Le message d'erreur est le suivant:
Error in if (x[i] == 0 && x[i - 1] == 0 && x[i - 12] == 0) { :
valeur manquante là où TRUE / FALSE est requis

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Pierre-Yves Berrard » 29 Oct 2020, 14:52

Bonjour,
Je n'arrive pas à reproduire votre erreur. Il manque un objet nommé g.
PY

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 14:58

En effet, je l'ai omis, l'objet g est le suivant:

Code : Tout sélectionner

g <- integer(length(x))


Le nouveau message d'erreur est:
Error in g0 + 1 : argument non numérique pour un opérateur binaire

Merci pour votre réponse

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Pierre-Yves Berrard » 29 Oct 2020, 15:06

De ce que je comprends, vous essayez d'additionner 1 et "bord".
PY

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 15:14

Dans le cas où x[i]==1, g0 doit être "bord", mais le remplacer par un chiffre n'est pas dans la logique du résultat recherché.
J'ai énoncé toutes les conditions pour le cas où x[i]==0, la dernière, constituant le "else" doit donc être le cas où x[i]==1, et où le résultat désiré est "bord".

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Pierre-Yves Berrard » 29 Oct 2020, 15:40

Le bug arrive quand i=9, c'est la condition

Code : Tout sélectionner

x[i]==&& x[i-1]==&& i%in%v2
qui est remplie (j'ai vérifié) et g0 vaut "bord" (je ne sais pas si c'est normal). Et donc l'addition échoue.

Une remarque générale : ajouter un élément caractère à un vecteur numérique convertit le tout en caractère.

Code : Tout sélectionner

test <- c(0, 1)
test[3] <- "bord"
test
#> [1] "0"    "1"    "bord"    
Ça ne me semble pas être une bonne idée.
PY

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 15:56

J'ai compris ce que vous voulez dire.
Pensez-vous qu'il est possible de rajouter une condition pour laquelle g prend la valeur du "dernier résultat + 1" n'étant pas "bord"?

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Mickael Canouil » 29 Oct 2020, 16:09

Bonjour,

pourquoi y a-t-il autant d'affectation ?

Voici une (deux) réécriture(s) et ce que je pense être le résultat souhaité.

Code : Tout sélectionner


  b 
<- data.frame(c(
  
000000010000,
  
000000010000,
  
000000010000,
  
000000010000,
  
111111111111,
  
000100000100,
  
000100000100,
  
000111111100,
  
000100000111,
  
000100000100,
  
000100000100
)) 

Code : Tout sélectionner

group1 <- function(x) {
  
<- integer(length(x))
  
g0 <- 1
  v 
<- c(13L25L37L49L61L73L85L97L109L121L)
  
v2 <- c(2L3L4L5L6L7L8L9L10L11L12L)
  for (
i in seq.int(g)) {
    
g[i] <-
      if (
x[i] == && == 1L) {
        
g[i] <- g0
      
} else if (x[i] == && %in&& x[12] == 1) {
        
g[i] <- g0 <- g0 1
      
} else if (x[i] == && x[1] == && %inv2) {
        
g[i] <- g0 <- g0 1
      
} else if (x[i] == && x[1] == && x[12] == 1) {
        
g[i] <- g0 <- g0 1
      
} else if (x[i] == && %in&& x[12] == 0) {
        
g[i] <- g0 <- g[12]
      } else if (
x[i] == && x[1] == && x[12] == 0) {
        
g[i] <- g0 <- g[12]
      } else if (
x[i] == && x[1] == && %inv2) {
        
g[i] <- g0 <- g[1]
      } else if (
x[i] == && x[1] == && x[12] == 1) {
        
g[i] <- g0 <- g[1]
      } else if (
x[i] == && x[1] == && x[12] == 0) {
        
g[i] <- g0 <- g[1]
      } else {
        
g[i] <- g0 <- "bord"
      
}
    
g0 <- if (g[i] == "bord"else g[i]
  }
  
g

Code : Tout sélectionner

group2 <- function(x) {
  
<- integer(length(x))
  
g0 <- 1
  v 
<- c(13L25L37L49L61L73L85L97L109L121L)
  
v2 <- c(2L3L4L5L6L7L8L9L10L11L12L)

  for (
i in seq.int(g)) {
    
c1 <- x[i] == 0
    c2 
<- == 1L
    c3 
<- %inv
    c4 
<- x[12L] == 1
    c5 
<- x[1L] == 1
    c6 
<- %inv2
    c7 
<- x[12L] == 0
    c8 
<- x[1L] == 0

    g
[i] <-
      if (
c1 && c2) {
        
g0
      
} else if (c1 && c3 && c4) {
        
g0 1
      
} else if (c1 && c5 && c6) {
        
g0 1
      
} else if (c1 && c5 && c4) {
        
g0 1
      
} else if (c1 && c3 && c7) {
        
g[12]
      } else if (
c1 && c5 && c7) {
        
g[12]
      } else if (
c1 && c8 && c6) {
        
g[1]
      } else if (
c1 && c8 && c4) {
        
g[1]
      } else if (
c1 && c8 && c7) {
        
g[1]
      } else {
        -
9
      
}
    
g0 <- if (g[i] == -9else g[i]
  }

  
g[== -9] <- "bord"
  
g

Code : Tout sélectionner

group3 <- function(x) {
  
<- integer(length(x))
  
g0 <- 1
  v 
<- c(13L25L37L49L61L73L85L97L109L121L)
  
v2 <- c(2L3L4L5L6L7L8L9L10L11L12L)

  for (
i in seq.int(g)) {
    
c1 <- x[i] == 0
    c2 
<- == 1L
    c3 
<- %inv
    c4 
<- x[12L] == 1
    c5 
<- x[1L] == 1
    c6 
<- %inv2
    c7 
<- x[12L] == 0
    c8 
<- x[1L] == 0

    g
[i] <-
      if (
c1 && c2) {
        
g0
      
} else if ((c1 && c3 && c4) | (c1 && c5 && c6) | (c1 && c5 && c4)) {
        
g0 1
      
} else if ((c1 && c3 && c7) | (c1 && c5 && c7)) {
        
g[12]
      } else if ((
c1 && c8 && c6) | (c1 && c8 && c4)| (c1 && c8 && c7)) {
        
g[1]
      } else {
        -
9
      
}
    
g0 <- if (g[i] == -9else g[i]
  }

  
g[== -9] <- "bord"
  
g

Code : Tout sélectionner

b$group1 <- group1(b$a)
b$group2 <- group2(b$a)
b$group3 <- group3(b$a)
head(b15)
#>    a group1 group2 group3
#> 1  0      1      1      1
#> 2  0      1      1      1
#> 3  0      1      1      1
#> 4  0      1      1      1
#> 5  0      1      1      1
#> 6  0      1      1      1
#> 7  0      1      1      1
#> 8  1   bord   bord   bord
#> 9  0      2      2      2
#> 10 0      2      2      2
#> 11 0      2      2      2
#> 12 0      2      2      2
#> 13 0      1      1      1
#> 14 0      1      1      1
#> 15 0      1      1      1 

Code : Tout sélectionner

plot(bench::mark(group1(b$a), group2(b$a), group3(b$a)))
#> Loading required namespace: tidyr 

Image

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 16:16

Bonjour,

En effet, votre code fonctionne et est optimisé.
J'aimerais cependant modifier la condition suivante :

Si x[i]==0 et x[i-1]==0 et x[i-12]=0 alors
g prend la dernière valeur la plus haute et différente de "bord"

Pensez-vous cela possible?
(car dans la boucle, il arrive que l'on redescende dans les valeurs de g au fur et à mesure des itérations)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Mickael Canouil » 29 Oct 2020, 16:22

Plus que de l'optimisation, c'est du "do not repeat yourself".

Il vous suffit de modifier le if else de l'affectation à g0.

Code : Tout sélectionner

<- data.frame(= c(
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,
  0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,
  0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,
  0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1,
  0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0,
  0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0
))

Code : Tout sélectionner

group3 <- function(x) {
  g <- integer(length(x))
  g0 <- 1
  v 
<- c(13L, 25L, 37L, 49L, 61L, 73L, 85L, 97L, 109L, 121L)
  v2 <- c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L)

  for (i in seq.int(g)) {
    c1 <- x[i] == 0
    c2 
<- i == 1L
    c3 
<- i %in% v
    c4 
<- x[- 12L] == 1
    c5 
<- x[- 1L] == 1
    c6 
<- i %in% v2
    c7 
<- x[- 12L] == 0
    c8 
<- x[- 1L] == 0

    g
[i] <-
      if (c1 && c2) {
        g0
      
} else if ((c1 && c3 && c4) | (c1 && c5 && c6) | (c1 && c5 && c4)) {
        g0 + 1
      
} else if ((c1 && c3 && c7) | (c1 && c5 && c7)) {
        g[- 12]
      } else if ((c1 && c8 && c6) | (c1 && c8 && c4)| (c1 && c8 && c7)) {
        g[- 1]
      } else {
        -9
      
}
    g0 <- if (g[i] == -9) g0 else g[i]
  }

  g[== -9] <- "bord"
  g
}

Code : Tout sélectionner

b$group3 <- group3(b$a)
b[c(1:10, (nrow(b)-10):nrow(b)), ]
#>     a group3
#> 1   0      1
#> 2   0      1
#> 3   0      1
#> 4   0      1
#> 5   0      1
#> 6   0      1
#> 7   0      1
#> 8   1   bord
#> 9   0      2
#> 10  0      2
#> 122 0      3
#> 123 0      3
#> 124 1   bord
#> 125 0      4
#> 126 0      4
#> 127 0      4
#> 128 0      4
#> 129 0      4
#> 130 1   bord
#> 131 0      5
#> 132 0      5  
Mickaël
mickael.canouil.fr | rlille.fr

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Lorenzo Barrail » 29 Oct 2020, 16:34

J'ai testé, mais ça ne me donne pas le résultat souhaité. Pardonnez-moi mais je ne comprends votre modification du if else de l'affectation de g pour cette condition.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: erreur "valeur manquante là où TRUE / FALSE est requis"

Messagepar Mickael Canouil » 02 Nov 2020, 09:16

EN effet, cela ne donne pas le résultat souhaité, puisque celui-ci n'est pas clair.

Comme démontré et modifié dans mon dernier message, "Il vous suffit de modifier le if else de l'affectation à g0.".
Ainsi, définissez la ou les conditions qui vous sied à la place des deux variantes du code que j'ai indiqué.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité