IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Discrétisation d'une variable selon une autre variable


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut Discrétisation d'une variable selon une autre variable
    Bonjour,

    Ca fait un moment que je bloque sur un problème qui pourtant semble tout bête. Je n'arrive pas à discrétiser une variable. J'en suis presque à m'attaquer aux données brutes mais bon ça serait dommage. S'il vous plait aidez moi!

    Soit un tableau de données z.
    Ce tableau comprends les variables quantitatives continues suivantes
    - Age
    - SC.62
    - SC.63
    - SC.64
    - SC.65
    - SC.66
    - SC.67

    Un SC est un scénario qui sera le même selon la génération de naissance (mais pas l'age car les données combinent des dates différentes). Les scénarios sont croissants de SC.62 à SC.67. J'aimerais discrétiser l'age selon les scénarios. J'ai fait une boucle qui créer une nouvelle variable Z qualitative avec comme modalités Sc.Min, Sc.62, ... , Sc.67. Mais le programme ne tourne pas des erreurs apparaissent R n'aime pas mes nombreux else. Je ne sais pas trop comment procéder, quelqu'un a des idées?

    for (i in 1:length(z))
    { Z=0
    if (z$Age[i] < z$SC.62[i])
    {Z[i] == "Sc.Min"}
    else
    {if (z$Age[i] < z$SC.63[i])
    {Z[i] == "Sc62"}}
    else
    {if (z$Age[i] < z$SC.64[i])
    {Z[i] == "Sc.63"}}
    else
    {if (z$Age[i] < z$SC.65[i])
    {Z[i] == "Sc.64"}}
    else
    {if (z$Age[i] < z$SC.66[i])
    {Z[i] == "Sc.65"}}
    else
    {if (z$Age[i] < z$SC.67[i])
    {Z[i] == "Sc.66"}}
    else
    {if (z$Age[i] >= z$SC.67[i])
    {Z[i] == "Sc.67"}}
    }
    Merci de votre aide!

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    Salut,

    R est un langage vectoriel.
    Parcourir un vecteur ligne à ligne du coup c'est un peu (beaucoup) dommage.
    De plus il existe des façons plus condensées et plus élégantes pour filtrer un vecteur qu'un ifelse.

    Le code devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    z$Age[z$Age>=z$SC.67]<-"SC.67"
    z$Age[z$Age<z$SC.66]<-"SC.66"
    [...]
    z$Age[z$Age<z$SC.63]<-"SC.63"
    z$Age[z$Age<z$SC.62]<-"SC.min"

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Bonjour,

    Merci de ta réponse. Ton programme est plus optimisé, mais malgré tout, ça ne fonctionne pas. En effet, lorsque je lance le programme légèrement modifié (j'ai créé une autre colonne), tous mes individus sont classifiés en Sc.62 et Sc.Min.


    z$Scenario=z$Age
    z$Scenario[z$Scenario >= z$SC.67] <- "Sc.67"
    z$Scenario[z$Scenario >= z$SC.66] <- "Sc.66"
    z$Scenario[z$Scenario >= z$SC.65] <- "Sc.65"
    z$Scenario[z$Scenario >= z$SC.64] <- "Sc.64"
    z$Scenario[z$Scenario >= z$SC.63] <- "Sc.63"
    z$Scenario[z$Scenario >= z$SC.62] <- "Sc.62"
    z$Scenario[z$Scenario < z$SC.62] <- "Sc.Min"
    z$Scenario <- as.factor(z$Scenario)
    summary(z)

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Forcément, votre de remplissage fait que vous écrasez toutes les autres valeurs renseignées précédemment par la dernière.
    Essayez plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    z$Scenario[z$Scenario < z$SC.62] <- "Sc.Min"
    z$Scenario[z$Scenario >= z$SC.62] <- "Sc.62"
    z$Scenario[z$Scenario >= z$SC.63] <- "Sc.63"
    z$Scenario[z$Scenario >= z$SC.64] <- "Sc.64"
    z$Scenario[z$Scenario >= z$SC.65] <- "Sc.65"
    z$Scenario[z$Scenario >= z$SC.66] <- "Sc.66"
    z$Scenario[z$Scenario >= z$SC.67] <- "Sc.67"
    z$Scenario <- as.factor(z$Scenario)
    Là, ça devrait aller mieux.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut
    edit: owned

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Effectivement, mon code écrase les valeurs renseigné mais le votre aussi! Je n'ai que des Sc.67!

    Je ne comprends pas pourquoi ça écrase les valeurs alors qu'elle ne répondent plus au critère car elles ont été changées!

    Concernant mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z$Scenario[z$Scenario >= z$SC.67] <- "Sc.67"
    Cette ligne identifie tous les individus dont l'age est supérieur au scénario 67 dans la classe Sc.67
    On efface l'age au profit de l'indicatif Sc.67

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z$Scenario[z$Scenario >= z$SC.66] <- "Sc.66"
    Du coup ici, on prends les individus dont l'age est supérieur au scénario 66; sachant qu'on à déjà exclu les individus du scénario 67. Mais R ne semble pas voir les choses de cette manière, il considère que "Sc.67" >= z$SC.66 .

    Dans ta version, R traite bien la premiere condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z$Scenario[z$Scenario < z$SC.62] <- "Sc.Min"
    Mais la deuxième instruction demande à R de mettre toutes les ages qui sont supérieurs au scénario 62 dans la catégorie 62
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z$Scenario[z$Scenario >= z$SC.62] <- "Sc.62"
    Ces deux instructions coupent tous les individus en 2 et modifient la totalité des modalités.

    Ensuite R retraite les instructions suivantes de manière étrange
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z$Scenario[z$Scenario >= z$SC.63] <- "Sc.63"
    R pense que "Sc.62" >= z$SC.63 et le recode en Sc.63

    Au début je pensais que R s'arrétait au chiffre "Sc.67" >= z$SC.66 car 67 > 66 mais non car ici on a "Sc.62" >= z$SC.63 alors que 62 < 63

  7. #7
    Membre chevronné
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Par défaut


    Créé une autre variable sinon tu vas pas t'en sortir la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    z$TAMPON<-character(length(z$Scenario))
    z$TAMPON[z$Scenario < z$SC.62] <- "Sc.Min"
    z$TAMPON[z$Scenario >= z$SC.62] <- "Sc.62"
    z$TAMPON[z$Scenario >= z$SC.63] <- "Sc.63"
    z$TAMPON[z$Scenario >= z$SC.64] <- "Sc.64"
    z$TAMPON[z$Scenario >= z$SC.65] <- "Sc.65"
    z$TAMPON[z$Scenario >= z$SC.66] <- "Sc.66"
    z$TAMPON[z$Scenario >= z$SC.67] <- "Sc.67"
    Au passage on ne sait pas vraiment la valeur que prennent tes valeurs SC.62,63 etc... donc on te donne ca à titre indicatif après faut réflechir un minimum pour adapter ca à tes données (mettre les inégalités du bon côté etc...).


    edit: ca buggait car une inégalité du style 1>"charactere" est NA et par défaut quand c'est NA ca filtre pas.


    reedit: fiiirst x)

  8. #8
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Il y a quand même un truc qui me gêne depuis le départ, c'est que Scenario contient un entier au tout début (age), puis on le remplit avec une chaîne de caractères.
    Or, quand on compare entier et chaine de caractères au fur et à mesure, pas étonnant qu'on obtienne des résultats bizarres...

    Essayez plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    z$Scenario=z$Age
    z$Scenario[z$Age < z$SC.62] <- "Sc.Min"
    z$Scenario[z$Age >= z$SC.62] <- "Sc.62"
    z$Scenario[z$Age >= z$SC.63] <- "Sc.63"
    z$Scenario[z$Age >= z$SC.64] <- "Sc.64"
    z$Scenario[z$Age >= z$SC.65] <- "Sc.65"
    z$Scenario[z$Age >= z$SC.66] <- "Sc.66"
    z$Scenario[z$Age >= z$SC.67] <- "Sc.67"
    z$Scenario <- as.factor(z$Scenario)
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut YES
    C'est ça!
    Merci Ced et merci à tout le monde.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/11/2012, 19h44
  2. Réponses: 0
    Dernier message: 19/11/2012, 11h57
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Réponses: 12
    Dernier message: 12/09/2007, 16h28
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo