étendre une valeur jusqu’à la prochaine valeur non vide

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

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar Theo Boudard » 11 Mar 2021, 09:56

Bonjour,
Je poste ce message car je cherche depuis plusieurs jours en vain à étendre une valeur jusqu'a la prochaine cellule non vide, je m'explique :

J'ai un df sous la forme suivante :

Code : Tout sélectionner

        Date_TU          ID_pluie       Pluviometrie_en_mm
1  2017-01-04 21:00:00        1                0,2     
2  2017-01-04 21:02:00       NA               NA
3  2017-01-04 21:06:00       NA               NA
4  2017-01-04 21:50:00       NA               NA
5  2017-01-04 21:58:00       NA               NA
6  2017-01-04 22:28:00        2                0,4
7  2017-01-04 22:34:00       NA               NA
8  2017-01-04 22:38:00       NA               NA
9  2017-01-04 22:44:00       NA               NA
10 2017-01-04 22:50:00       3                0,2
11 2017-01-04 22:58:00      NA               NA 


Je cherche a remplacer les NA par le n° d’identification (ID_pluie) qui précède la ligne. Ce qui donnerait ça :

Code : Tout sélectionner

        Date_TU          ID_pluie       Pluviometrie_en_mm
1  2017-01-04 21:00:00        1               0,2     
2  2017-01-04 21:02:00        1               NA
3  2017-01-04 21:06:00        1               NA
4  2017-01-04 21:50:00        1               NA
5  2017-01-04 21:58:00        1               NA
6  2017-01-04 22:28:00        2               0,4
7  2017-01-04 22:34:00        2               NA
8  2017-01-04 22:38:00        2               NA
9  2017-01-04 22:44:00        2               NA
10 2017-01-04 22:50:00       3               0,2
11 2017-01-04 22:58:00       3               NA 


Je comprend ce que je dois demander a R : "dupliquer les cellule de la colonne "ID_pluie" jusqu’à la prochaine cellule non-vide." Mais je n'ai aucune idée de comment formulé ça. Si vous avez une méthode ou une fonction a me proposer je suis donc preneur.

Merci pour votre aide,

cordialement,

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar Sébastien Rochette » 11 Mar 2021, 09:59

Bonjour,

Vous pouvez utiliser le package {tidyr}. Il est fait pour nettoyer les données et notamment récupérer ce genre de problème.
Pour cela, utilisez la fonction

Code : Tout sélectionner

fill()
:

Code : Tout sélectionner

library(tidyr)
data %>% fill(ID_pluie)
Sébastien
Dev, Consult, Formateur
ThinkR

Theo Boudard
Messages : 19
Enregistré le : 06 Jan 2021, 15:32

Re: étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar Theo Boudard » 11 Mar 2021, 10:33

Merci beaucoup pour cette solution. C'est si simple mais j'ai cherché si longtemps, je suis partagé entre soulagement et frustration.
Bonne journée

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar Eric Casellas » 11 Mar 2021, 13:35

Theo Boudard a écrit :Merci beaucoup pour cette solution. C'est si simple mais j'ai cherché si longtemps, je suis partagé entre soulagement et frustration.
Bonne journée


Bonjour,

Avec R et tous ses paquets de la communauté il peut être difficile de trouver les fonctions dont on a besoin...

Mais sinon en terme d'algorithme "naif" pour répondre à ton besoin :
itérativement dans l'ordre de tes lignes
regarder si la valeur est définie, si oui la garder en mémoire et si la valeur est NA alors remplacer par la dernière valeur gardé en mémoire issue de l’itération précédente
juste ça gère pas les cas ou les 1ere valeurs sont NA...

Eric
Eric

jframi
Messages : 8
Enregistré le : 17 Déc 2004, 16:05

Re: étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar jframi » 12 Mar 2021, 13:06

Bonjour,
Une proposition faisant appel à data.table :

Code : Tout sélectionner

library(data.table)
dt<- data.table(Date_TU=Sys.Date(), ID_Pluie=c(1,rep(NA,4),2,rep(NA,3),3, rep(NA,2)))
dt
#       Date_TU ID_Pluie
# 1: 2021-03-12        1
# 2: 2021-03-12       NA
# 3: 2021-03-12       NA
# 4: 2021-03-12       NA
# 5: 2021-03-12       NA
# 6: 2021-03-12        2
# 7: 2021-03-12       NA
# 8: 2021-03-12       NA
# 9: 2021-03-12       NA
#10: 2021-03-12        3
#11: 2021-03-12       NA
#12: 2021-03-12       NA

dt[,ID_Pluie_fill:=rep(ID_Pluie[1],.N),cumsum(!is.na(ID_Pluie))]
dt

#       Date_TU ID_Pluie ID_Pluie_fill
# 1: 2021-03-12        1               1
# 2: 2021-03-12       NA               1
# 3: 2021-03-12       NA               1
# 4: 2021-03-12       NA               1
# 5: 2021-03-12       NA               1
# 6: 2021-03-12        2               2
# 7: 2021-03-12       NA               2
# 8: 2021-03-12       NA               2
# 9: 2021-03-12       NA               2
#10: 2021-03-12        3               3
#11: 2021-03-12       NA               3
#12: 2021-03-12       NA               3


JF

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

Re: étendre une valeur jusqu’à la prochaine valeur non vide

Messagepar Mickael Canouil » 13 Mar 2021, 11:41

Bonjour,

la "vraie" approche avec data.table est la suivante, en utilisant data.table::nafill

Code : Tout sélectionner

df <- read.table(text = "Date_TU          ID_pluie       Pluviometrie_en_mm
'2017-01-04 21:00:00'        1                0,2     
'2017-01-04 21:02:00'       NA               NA
'2017-01-04 21:06:00'       NA               NA
'2017-01-04 21:50:00'       NA               NA
'2017-01-04 21:58:00'       NA               NA
'2017-01-04 22:28:00'        2                0,4
'2017-01-04 22:34:00'       NA               NA
'2017-01-04 22:38:00'       NA               NA
'2017-01-04 22:44:00'       NA               NA
'2017-01-04 22:50:00'       3                0,2
'2017-01-04 22:58:00'      NA               NA"
, header = TRUE)

Code : Tout sélectionner

library(data.table)
setDT(df)[= ID_pluie := nafill(ID_pluie, type = "locf")][]
#>                 Date_TU ID_pluie Pluviometrie_en_mm
#>  1: 2017-01-04 21:00:00        1                0,2
#>  2: 2017-01-04 21:02:00        1               <NA>
#>  3: 2017-01-04 21:06:00        1               <NA>
#>  4: 2017-01-04 21:50:00        1               <NA>
#>  5: 2017-01-04 21:58:00        1               <NA>
#>  6: 2017-01-04 22:28:00        2                0,4
#>  7: 2017-01-04 22:34:00        2               <NA>
#>  8: 2017-01-04 22:38:00        2               <NA>
#>  9: 2017-01-04 22:44:00        2               <NA>
#> 10: 2017-01-04 22:50:00        3                0,2
#> 11: 2017-01-04 22:58:00        3               <NA>


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é