gestion de données en format "long"

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

Tai PHAM
Messages : 46
Enregistré le : 18 Jan 2011, 11:58

gestion de données en format "long"

Messagepar Tai PHAM » 08 Mar 2019, 16:39

Bonjour,

En cherchant comment utiliser les données d'une ligne précédente pour créer une nouvelle variable sur la ligne "+1", j'ai trouvé sur le forum une réponse de 2011 qui fonctionne bien mais je voudrais comprendre comment cela fonctionne pour l'adapter à d'autres situations.

J'ai contacté l'auteur de la réponse mais étant donné le temps écoulé, il ne participe peut-être plus au forum ou a changé d'adresse mail.

Le code proposé était le suivant:

Code : Tout sélectionner

tab <- data.frame(
        id = rep(LETTERS[1:3], each = 2),
        code = sample(1:6),
        mois = sample(1:12))

tab$p.code <- c(NA, tab$code[-length(tab$code)])

tab$nou <- ifelse(tab$mois == 4 & tab$code == 2 & tab$p.code == 1, 1, tab$code)


la seule chose que je ne comprends pas est la raison pour laquelle

Code : Tout sélectionner

tab$code[-length(tab$code)]


renvoie la valeur "code" de la ligne précédente.
Peut-on faire la même chose en sélectionnant la valeur de la ligne situé 2 rangs au dessus? De la ligne suivante...

Merci de vos lumières!

Tài

Serge Rapenne
Messages : 1263
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: gestion de données en format "long"

Messagepar Serge Rapenne » 09 Mar 2019, 13:17

bonjour,

tab$code[-length(tab$code)]ne retourne pas valeur "code" de la ligne précédente, ca retourne tab$code sans sa derniere valeur, c'est
c(NA, tab$code[-length(tab$code)]) qui crée un vecteur decalé d'une valeur commencent par NA.

il est bien sûr possible de decaler de plus d'une valeur, par ex comme ça en utilisant la même logique :

Code : Tout sélectionner

nb_decale<-3 (si on veut decaler de 3 valeurs)
tab$p.code<-c(rep(NA,nb_decale),tab$code[-((length(tab$code)-nb_decale+1):length(tab$code))])

mais plus simplement j'utiliserais la fonction lag du package dplyr

Code : Tout sélectionner

library(dplyr)
tab$p.code<-lag(tab$code,nb_decale)


Serge


Retourner vers « Questions en cours »

Qui est en ligne

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