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

SAS Base Discussion :

Selectionner des observations autour d'une valeur


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut Selectionner des observations autour d'une valeur
    Bonsoir,

    mon problème est assez simple je pense :
    J'ai des pays en colonne, auxquels est associé une variable qui prend des valeurs allant de 1000 à 30000.
    Ensuite je sélectionne un pays par exemple la France auquel la valeur 18000 est associée.
    Ce que je voudrais c'est pouvoir sélectionner les 60 pays qui ont une valeur proche de 18000 (cad les 30 pays au dessus et les 30 pays en dessous).

    PS : Aussi comme le pays sélectionné peut changer dans mon analyse, j'aimerais que la valeur 18000 n'apparaissent pas dans le code, mais plutôt le nom du pays, comme ça il me suffirait de changer le nom du pays seulement sans avoir à vérifier la valeur du nouveau pays.

    Merci bcp!!!

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    tu peux nous envoyer un exemple de tables ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    En fait ça ressemble à ça, j'ai classé par valeur croissante de la variable expyiso :

    Avec ISO qui correspond à un code pays. Donc si je veux choisir le Koweit dans mon analyse par exemple, le code ISO est 414.

    Or je me rends compte qu'il n'y a pas 30 valeurs au dessus (car classé parmi les 5 premiers). Mais il y a bien 30 valeurs en dessous. Dans ce cas j'aimerais choisir les 60 pays qui entourent ce pays (donc les 2 qui sont au dessus et les 58 autres en dessous).
    Mais comme je change le pays de référence dans mes analyses, j'aimerais un code qui puisse s'adapter

    Merci et désolée pour la longueur du message

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    ISO expyiso 
    527 2135.37 
    624 2190.08 
    238 2736.31 
    258 2836.54 
    520 3004.42 
    706 4013.36 
    174 4033.84 
    162 4237.8 
    454 4244.01 
    304 4568.37 
    646 4621.86 
    562 4728.52 
    854 4913.63 
    231 5072.3 
    768 5171.36 
    270 5319.21 
    324 5357.3 
    204 5389.96 
    180 5390.8 
    296 5452.5 
    736 5507.58 
    148 5593.15 
    136 5841.61 
    090 5845.26 
    104 5963.84 
    732 6068.02 
    583 6081.76 
    384 6095.19 
    140 6189.14 
    548 6265.16 
    598 6302.17 
    288 6468.77 
    430 6471.97 
    178 6503.61 
    192 6555.69 
    584 6667.1 
    540 6669.18 
    120 6683.6 
    060 6754.06 
    184 6768.38 
    328 6811.1 
    466 6889.96 
    108 6907.02 
    894 6981.5 
    262 7030.86 
    496 7065.9 
    670 7101.91 
    876 7168.6 
    232 7227.61 
    834 7228.5 
    654 7233.29 
    666 7326.34 
    798 7376.17 
    418 7382.72 
    516 7474.91 
    566 7661.41 
    800 7764.9 
    795 7774.01 
    404 7818.28 
    132 7880.62 
    776 7895.84 
    450 7914.83 
    678 7915.63 
    478 8003.52 
    716 8025.8 
    694 8050.08 
    332 8289.75 
    524 8314.66 
    068 8344.01 
    116 8434.27 
    462 8526.14 
    604 8612.1 
    586 8630.41 
    860 8635.26 
    558 8768.02 
    686 8774.31 
    340 8866.65 
    417 8935.64 
    612 8998.19 
    796 9007.89 
    740 9056.14 
    50 9128.42 
    242 9141.28 
    887 9199.19 
    004 9219.51 
    626 9237.51 
    175 9263.18 
    577 9282.06 
    762 9327.06 
    574 9340.84 
    570 9386.36 
    144 9407.87 
    426 9590.07 
    218 9617.09 
    504 9720.23 
    234 9771.43 
    760 9814.97 
    398 9845.93 
    072 9849.85 
    320 9887.09 
    152 9963.25 
    388 9996.11 
    580 10051.99 
    166 10074.57 
    882 10088.02 
    275 10130.59 
    500 10161.65 
    024 10187.24 
    051 10194 
    292 10285.01 
    266 10326.33 
    600 10421.27 
    086 10498.22 
    064 10580.1 
    508 10640.76 
    704 10730.96 
    585 10737.12 
    268 10800.05 
    222 10850.95 
    530 10854.12 
    807 10892.22 
    368 11014.89 
    480 11080.51 
    170 11137.16 
    214 11174.25 
    660 11179.93 
    360 11180.07 
    772 11240.37 
    533 11457.79 
    498 11559.22 
    260 11595.33 
    748 11623.5 
    308 11687.95 
    837 11703.35 
    212 11747.64 
    020 11768.49 
    400 11915.56 
    788 11916.08 
    662 12065.65 
    008 12182.19 
    636 12196.94 
    422 12232.65 
    036 12236 
    044 12283.85 
    536 12293.02 
    084 12467.5 
    499 12562.44 
    839 12616.51 
    352 12659.19 
    012 12674.65 
    031 12755.07 
    100 12783.97 
    032 12785.71 
    591 12838.1 
    858 12979.3 
    092 13093.52 
    473 13110.29 
    076 13206.32 
    699 13252.83 
    818 13401.56 
    492 13410.79 
    408 13466.14 
    792 13580.76 
    690 13593.27 
    028 13679.52 
    070 13920.57 
    710 14022.5 
    849 14061.8 
    838 14098.58 
    446 14126.29 
    804 14182.16 
    642 14237.51 
    191 14249.7 
    764 14256.94 
    608 14398.11 
    688 14413.9 
    300 14490.11 
    784 14659.91 
    188 14671.35 
    096 14853.96 
    112 14902.17 
    440 14951.86 
    233 15127.28 
    364 15172.94 
    620 15219.82 
    862 15451.21 
    428 15509.95 
    643 15528.34 
    484 15701.25 
    659 15728.96 
    052 15776.84 
    156 15874.4 
    616 15896.52 
    899 16041.37 
    196 16069.65 
    458 16082.41 
    703 16189.75 
    381 16327.67 
    344 16395.43 
    410 16409.84 
    512 16414.87 
    724 16550.39 
    376 16566.62 
    568 16706.5 
    554 16769.32 
    490 16871.33 
    348 16951.6 
    705 17172.24 
    124 17176.86 
    251 17291.43 
    203 17335.37 
    048 17452.13 
    470 17461.25 
    842 17519.08 
    528 17612.43 
    826 17619.53 
    226 17665.64 
    056 17805.25 
    579 17943.28 
    040 18010.68 
    276 18046.4 
    392 18166.85 
    208 18485.27 
    246 18669.24 
    752 18711.85 
    702 18757.15 
    780 18892.56 
    757 19082.32 
    434 19218.17 
    372 22329.17 
    682 22904.48 
    414 24459.8 
    442 25164.16 
    634 32789.81

  4. #4
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Un code du genre :

    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
     
    %LET CODEISO = 414;
     
    proc sql;
    	select expyiso into:val from table where iso=&CODEISO;
    quit;
     
    data table;
    set table;
    diff=abs(expyiso-&val);
    run;
     
    proc sort data=table;
    by diff;
    run;
     
    data table;
    set table (obs=51 drop=diff);
    run;

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par edward carnby Voir le message
    Bonjour,

    Un code du genre :

    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
     
    %LET CODEISO = 414;
     
    proc sql;
    	select expyiso into:val from table where iso=&CODEISO;
    quit;
     
    data table;
    set table;
    diff=abs(expyiso-&val);
    run;
     
    proc sort data=table;
    by diff;
    run;
     
    data table;
    set table (obs=51 drop=diff);
    run;

    Merci pour ta réponse.
    En fait, j'ai une erreur qui s'affiche quand je tape la proc sql :
    ERROR: Expression using equals (=) has components that are of different data types

    Et je voulais savoir à quoi correspond "val" et pourquoi à obs tu associes le nombre 51?

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Bonjour,

    L'erreur est peut être dûe au fait que ta variable iso est numérique, faut la convertir en caractère et utilise plutôt ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc sql;
    	select expyiso into:val from table where iso="&CODEISO";
    quit;

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Oui exactement! c'est ce que je viens de voir.
    Et pour ce qui concerne les observations, il suffisait de remplacer 51 par 61 pour avoir mes 60 pays similaires.

    C'est donc parfait, tout fonctionne bien.

    Merci à tous les deux.

    Forum génial

  8. #8
    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 : 47
    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.
    Voici une solution avec un tout petit peu de macro-variables : une pour le n° de la 1e observation à conserver, une pour la dernière, et une pour le code du pays à sélectionner.
    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
    %LET codeIso = 414 ;
     
    DATA NULL_ ;
      SET work.mariem NOBS=max ;
      IF iso="&codeIso" THEN DO ;
         debut = MAX(_N_-30,1) ; /* 1e obs située 30 lignes avant */
         fin = MIN(_N_+30,max) ; /* dernière obs située 30 lignes après */
    	 IF fin-debut < 60 THEN DO ; /* si on ne peut pas faire 30 et 30 on décale... */
    	   IF fin=max THEN debut = _N_-(60-(max-_N_)) ; /* ... vers le début */
    	   ELSE            fin   = 61-debut ;           /* ... vers la fin */
    	 END ;
    	 CALL SYMPUTX("debut", debut) ; /* --> macro-variables */
    	 CALL SYMPUTX("fin",   fin) ;
      END ;
    RUN ;
    DATA work.resultat ;
      SET work.mariem (FIRSTOBS=&debut OBS=&fin) ;
    RUN ;
    Bon courage.
    Olivier

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci Olivier !

    Je l'ai testé et il fonctionne parfaitement également
    Je vais tenter de comprendre comment tu écris ce programme car c'est trés intéressant d'utiliser les boucles.

    A ce propos j'ai une autre question car je souhaite tester différentes méthodes de classification:
    comment faire une classification en utilisant les fractions d'écart-type?
    J'ai pensé faire un proc cluster... ou peut-être existe-t-il une autre méthode.

    merci d'avance pour vos commentaires

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/03/2010, 12h19
  2. Decode avec des dates pour calculer une valeur
    Par decisio dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/01/2009, 13h50
  3. Placer des chaises autour d'une table
    Par bibi9 dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 04/11/2008, 10h42
  4. obtenir 100 lignes autour d'une valeur cible
    Par PickEpique dans le forum Langage SQL
    Réponses: 7
    Dernier message: 19/03/2007, 21h33
  5. [VB6] mettre des guillemets autour d'une chaîne
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/05/2006, 13h10

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