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

Débutez Discussion :

Tableau croisé


Sujet :

Débutez

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Tableau croisé
    Bonsoir à tous,

    Je débute en SAS, et j'aimerais solliciter votre aide concernant un petit problème que je rencontre. Je dispose d'une table comme suit:
    Nom : tableau.jpg
Affichages : 329
Taille : 56,1 Ko

    Et j'aimerais faire une sorte de tableau croisé, de la sorte sous sas:
    Nom : tableau croisé.jpg
Affichages : 161
Taille : 12,2 Ko

    où, par exemple, l'entrée (ligne=valeur2,colonne=valeur3) m'indique combien de fois dans mon tableau initial je passe de valeur2 à valeur3 (et non l'inverse, il y a une notion de temps (04,05,06,etc.), donc de sens, passer de valeur1 à valeur 2 est différent du passage réciproque. Le tableau n'est donc pas symétrique) au cours du temps (VAR_04, VAR_05, etc.). Par exemple, à ligne 3 du tableau on compterait 1 passage de valeur2 à valeur3 et un passage de valeur3 à valeur2.

    Je ne sais pas trop comment faire ça, c'est une sorte de tableau résumant l'état du réseau (le nombre de passage d'un état à l'autre).

    Je précise que le nombre de valeurs possibles est grand, et que j'ai déjà, si cela peut aider, fait un tableau sous excel que j'ai importé dans SAS où les observations et les variables sont comme dans le tableau que je souhaite obtenir.


    Je vous remercie pour votre aide, et vous souhaite une bonne soirée

    Wacker.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour, il manque quelques éléments.
    Quel est le nom (et le nombre) de tes variables, et quel est leur type (numérique ou longueur de caractère)

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonsoir !

    J'ai codé une première macro qui devrait me permettre d'effectuer ce que je désirais. Cela dit, les compteurs restent à 0.
    Je vous copie tout le code (quelques lignes), il tourne bien, mais les compteurs ne fonctionnent pas :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    DATA table1 ;
    input nom $  var2004  var2005  var2006   var2007 ;
    cards ;
    etu1 1 2 2 2
    etu2 1 2 3 4
    etu3 1 3 1 2
    run ;
     
    %MACRO test;
    DATA results;
    SET table1;
    %DO i=1 %TO 4 %BY 1;
    %DO j=1 %TO 4 %BY 1;
    RETAIN cpt&i.&j. 0;
    %if var2004=i and   var2005=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);
    %if var2005=i and	var2006=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);
    %if var2006=i and	var2007=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);
    %if var2007=i and	var2008=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);
    %if var2008=i and	var2009=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);
    %if var2009=i and	var2010=j %then cpt&i.&j.=%EVAL(cpt&i.&j.+1);	
    %END;
    %END;
    RUN;
    %MEND test;
    %test;
    Merci pour votre aide,

    Wacker.

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Ce sont des IF et pas des %IF. Et les %EVAL ne sont pas nécessaires.
    Pour faire court (il y a pas mal de posts sur le sujet), un %IF c'est quand la condition porte sur la valeur d'une macro-variable, et qu'on ne veut l'évaluer qu'une fois. Si la condition doit être évaluée à chaque observation, c'est un IF normal.
    J'écrirais donc IF var2004=&i AND var2005=&j then cpt&i.&j.=cpt&i.&j.+1 ;
    Bon courage.
    Olivier

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour Wacker,
    Je crois qu’un array à deux dimensions peut faire l’affaire et remplacer ta macro qui m’a au moins aidé à concevoir le problème et à réaliser le code que je te propose ici :
    Tu peux changer le nombre des éléments des deux arrays selon le nombre des variables et les valeurs souhaitées pour la comparaison.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    DATA table1 ;
    input nom $ var2004 var2005 var2006 var2007 ;
    cards ;
    etu1 1 2 2 2
    etu2 1 2 3 4
    etu3 1 3 1 2
    run ;
     
    data table2 (keep=cpt:) ;
    set table1 end=fin ;
    array etu(*) var2004-var2007 ; 
    array cpt(4,4) (16*0); /* initialisation à zéro la matrice compteur */
     
    do i=1 to 3 ;    /* Nombre des variables moins 1  */ 
    	do m=1 to 4 ;
    	   do n=1 to 4 ;
    		if etu(i)=m and etu(i+1)=n then cpt(m,n)=cpt(m,n)+1 ; 	
    		end ;
    	end ;
    end ;  
    if fin then output ;
    run ;	  
     
    /* Construction du tableau croisé */
    data table3	(keep=val: nobs) ;
    retain nobs val: ;
    set table2 ;
    array cpt(4,4) ;
    array val(4) ;
      do m=1 to 4;
        do n=1 to 4;
    		nobs=m ; 
            val(n)=cpt(m,n) ;	 
    	end ;  
    	output ;
      end ;
    run ;
    Cordialement
    Ward

  6. #6
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Mars 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci énormément hossward, ça marche parfaitement et ça va au-delà de ce que j'espérais faire.
    Cela dit, j'avoue ne pas comprendre toutes les subtilités des array et matrices sur SAS, aurais-tu un cours (*.pdf) expliquant bien tout cela? Parce que l'étape suivante est de calculer la norme (à définir, par exemple la somme des cases de la matrice) de ce tableau.

    Merci encore !

    Bonne journée à toi,

    Wacker.

Discussions similaires

  1. [CR11] Tableau croisé (TC)
    Par silversatch62 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 10/08/2005, 13h28
  2. [CR] comment faire un tableau croisé
    Par yoyothebest dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 29/08/2004, 18h32
  3. Réponses: 2
    Dernier message: 26/07/2004, 18h08
  4. Réponses: 3
    Dernier message: 26/07/2004, 12h03
  5. [CR9] Colorier les cellules d'un tableau croisé
    Par Koko22 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 14/11/2003, 16h57

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