Incrémenter une variable sans tenir compte des valeurs NA

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

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Incrémenter une variable sans tenir compte des valeurs NA

Messagepar Aline Tavaud » 02 Juil 2021, 07:29

Bonjour,

J'aimerai avoir un peu d'aide pour incrémenter une variable contenant des valeurs NA (avec un group by ou équivalent) sans prendre en compte ces valeurs NA.

J'ai la dataframe suivante:

Code : Tout sélectionner

[code]
data= rep(c("Jo1", "Jo2", "jo3"),3)
country=c(rep("France", 6), rep("Italy", 6), rep("Spain", 6))
sum2=c(10,8,5,7,18,25,16,6,15,6,16,22,14,8,16,4,17,15)
data=data.frame(data, country, sum2) %>% group_by(country) %>% mutate(max= max(sum2))

data=data %>% group_by(country) %>%  mutate(c5=ifelse(sum2>10, max(sum2), NA))

> data
# A tibble: 18 x 5
# Groups:   country [3]
   data  country  sum2   max    c5
   <chr> <chr>   <dbl> <dbl> <dbl>
 1 Jo1   France     10    25    NA
 2 Jo2   France      8    25    NA
 3 jo3   France      5    25    NA
 4 Jo1   France      7    25    NA
 5 Jo2   France     18    25    25
 6 jo3   France     25    25    25
 7 Jo1   Italy      16    22    22
 8 Jo2   Italy       6    22    NA
 9 jo3   Italy      15    22    22
10 Jo1   Italy       6    22    NA
11 Jo2   Italy      16    22    22
12 jo3   Italy      22    22    22
13 Jo1   Spain      14    17    17
14 Jo2   Spain       8    17    NA
15 jo3   Spain      16    17    17
16 Jo1   Spain       4    17    NA
17 Jo2   Spain      17    17    17
18 jo3   Spain      15    17    17
[/code]


Et j'aimerai pouvoir incrémenter de 1 la variable c5 (en groupand par country) comme dans l'exemple suivant:

Code : Tout sélectionner

> data2
# A tibble: 18 x 6
# Groups:   country [3]
   data  country  sum2   max    c5  ...6
   <chr> <chr>   <dbl> <dbl> <dbl> <dbl>
 1 Jo1   France     10    25    NA    NA
 2 Jo2   France      8    25    NA    NA
 3 jo3   France      5    25    NA    NA
 4 Jo1   France      7    25    NA    NA
 5 Jo2   France     18    25    25    25
 6 jo3   France     25    25    25    26
 7 Jo1   Italy      16    22    22    22
 8 Jo2   Italy       6    22    NA    NA
 9 jo3   Italy      15    22    22    23
10 Jo1   Italy       6    22    NA    NA
11 Jo2   Italy      16    22    22    24
12 jo3   Italy      22    22    22    25
13 Jo1   Spain      14    17    17    17
14 Jo2   Spain       8    17    NA    NA
15 jo3   Spain      16    17    17    18
16 Jo1   Spain       4    17    NA    NA
17 Jo2   Spain      17    17    17    19
18 jo3   Spain      15    17    17    20


Quelqu'un aurait il une idée pour faire cela ?

Merci d'avance,

Nicolas Halter
Messages : 23
Enregistré le : 25 Juin 2021, 08:30

Re: Incrémenter une variable sans tenir compte des valeurs NA

Messagepar Nicolas Halter » 02 Juil 2021, 08:46

Bonjour,

Voila une solution :

Code : Tout sélectionner

c6 <- c()
deb <- 0
for (i in 1:nlevels(as.factor(getElement(data, "country"))))
{
  k <- 0
  for (j in 1:(table(data$country)[i]))
  {
    if (is.na(data$c5[deb+j]) == FALSE)
    {
      c6 <- c(c6,data$c5[deb+j]+k)
      k <- k+1
    }
    else
    {
      c6 <- c(c6,NA)
    }
  }
  deb <- deb + table(data$country)[i]
}

data <- data.frame(data,c6)



Cordialement,
Nicolas

Michaël Delorme
Messages : 67
Enregistré le : 04 Avr 2016, 10:21

Re: Incrémenter une variable sans tenir compte des valeurs NA

Messagepar Michaël Delorme » 02 Juil 2021, 09:23

Code : Tout sélectionner

data %>%
  mutate(c6 = c5 + cumsum(!is.na(c5)) - 1)

Aline Tavaud
Messages : 14
Enregistré le : 29 Jan 2021, 10:49

Re: Incrémenter une variable sans tenir compte des valeurs NA

Messagepar Aline Tavaud » 02 Juil 2021, 10:59

Merci pour ces idées, je vais utiliser la deuxième pour mes données. Je note la fonction cumsum, qui m'a l'air bien utile pour ce genre de calcule.


Retourner vers « Questions en cours »

Qui est en ligne

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