Fonction pour extraction ligne suivante et précédente

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

Alice Kernet
Messages : 2
Enregistré le : 27 Mar 2019, 20:20

Fonction pour extraction ligne suivante et précédente

Messagepar Alice Kernet » 28 Mar 2019, 10:52

Bonjour,

Etant assez novice en R, je n’arrive pas à créer une fonction me permettant de récupérer les valeurs des lignes précédentes et suivantes.
Plus précisément, j’ai un jeu de données contenant 3 variables ID, date et poids. Les variables sont ordonnées par individu et par date croissante, comme ceci :

Code : Tout sélectionner

> data
   ID       Date Poids
1   1 2000-06-07  41.0
2   1 2001-06-13  42.0
3   1 2002-06-26  49.0
4   1 2003-06-25  <NA>
5   1 2003-12-03  47.5
6   2 2004-12-15  62.0
7   2 2005-12-07  <NA>
8   2 2006-12-06  <NA>
9   2 2007-12-05  67.0
10  2 2009-03-04  74.0
11  3 2003-02-12  75.0
12  3 2003-02-20  75.4
13  3 2003-03-12  75.6
14  3 2003-04-16  76.0
15  3 2003-05-14  <NA>
16  4 2003-05-26  <NA>
17  4 2003-06-11  56.0
18  4 2003-06-23  56.5
19  4 2003-07-02  54.5


Pour chaque individu ayant un poids « NA » j’aimerai récupérer le poids et la date précédent et suivant. Cette fonction me permettrai d'obtenir en sortie un dataframe comme ceci :

Code : Tout sélectionner

> data2
  ID       Date Poids  Date_prec Poids_prec  Date_suiv Poids_suiv
1  1 2003-06-25    <NA>  2002-06-26         49 2003-12-03       47.5
2  2 2005-12-07    <NA>  2004-12-15         62 2007-12-05       67.0
3  2 2006-12-06    <NA>  2004-12-15         62 2007-12-05       67.0
4  3 2003-05-14    <NA>  2003-04-16         76       <NA>         NA
5  4 2003-05-26    <NA>      <NA>          <NA>2003-06-11       56.0


Avez-vous une idée de comment je pourrai faire ?

Alice

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

Re: Fonction pour extraction ligne suivante et précédente

Messagepar Pierre-Yves Berrard » 28 Mar 2019, 20:06

Bonjour,

Une proposition avec le package dplyr :

Code : Tout sélectionner

library(dplyr)

data2 <-
  data %>%
  mutate_at(
    .vars = c("Date", "Poids"),
    .funs = list(prec = lag, suiv = lead)
  ) %>%
  filter(is.na(Poids))
PY

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

Re: Fonction pour extraction ligne suivante et précédente

Messagepar Michaël Delorme » 29 Mar 2019, 07:46

Comme on travaille par individu, il faut un group_by.
Pour terminer on peut, par exemple, utiliser coalesce pour choisir une valeur finale ou interpoler (exercice laissé au lecteur), etc.

Code : Tout sélectionner

library(tidyverse)

read_table("
N  ID Date        Poids
1   1 2000-06-07  41.0
2   1 2001-06-13  42.0
3   1 2002-06-26  49.0
4   1 2003-06-25  <NA>
5   1 2003-12-03  47.5
6   2 2004-12-15  62.0
7   2 2005-12-07  <NA>
8   2 2006-12-06  <NA>
9   2 2007-12-05  67.0
10  2 2009-03-04  74.0
11  3 2003-02-12  75.0", na = "<NA>") %>%
  group_by(ID) %>%
  mutate_at(.funs = list(prec = lag, suiv = lead),
            .vars = vars(Date, Poids)) %>%
  mutate(poids_final = coalesce(Poids, Poids_prec, Poids_suiv))


Code : Tout sélectionner

# A tibble: 11 x 9
# Groups:   ID [3]
       l    ID Date       Poids Date_prec  Poids_prec Date_suiv  Poids_suiv poids_final
   <dbl> <dbl> <date>     <dbl> <date>          <dbl> <date>          <dbl>       <dbl>
 1     1     1 2000-06-07  41   NA                 NA 2001-06-13       42          41 
 2     2     1 2001-06-13  42   2000-06-07         41 2002-06-26       49          42 
 3     3     1 2002-06-26  49   2001-06-13         42 2003-06-25       NA          49 
 4     4     1 2003-06-25  NA   2002-06-26         49 2003-12-03       47.5        49 
 5     5     1 2003-12-03  47.5 2003-06-25         NA NA               NA          47.5
 6     6     2 2004-12-15  62   NA                 NA 2005-12-07       NA          62 
 7     7     2 2005-12-07  NA   2004-12-15         62 2006-12-06       NA          62 
 8     8     2 2006-12-06  NA   2005-12-07         NA 2007-12-05       67          67 
 9     9     2 2007-12-05  67   2006-12-06         NA 2009-03-04       74          67 
10    10     2 2009-03-04  74   2007-12-05         67 NA               NA          74 
11    11     3 2003-02-12  75   NA                 NA NA               NA          75 

Alice Kernet
Messages : 2
Enregistré le : 27 Mar 2019, 20:20

Re: Fonction pour extraction ligne suivante et précédente

Messagepar Alice Kernet » 29 Mar 2019, 12:21

Bonjour Pierre-Yves et Michaël,
C'est exactement ce que je souhaitais, je vous remercie énormément pour vos réponses.
Cordialement,
Alice


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité