Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2011, 16h02   #1
Invité de passage
 
Homme
Ingénieur/Statisticien
Inscription : juin 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur/Statisticien
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 6
Points : 3
Points : 3
Par défaut Supprimer des lignes en fonction des "modalités" d'une variable

Bonjour, l'Intitulé de ce post n'est pas exact, voici le problème que je recontre.
En fait, je voudrais supprimer les lignes d'une table lorsque ma variable qualitative forme une série inférieure ou égale à 30 et conserver les séries supérieures à 30.


Exemple :
Ma var 1 peut prendre les modalités a b c ou d.
Var 1
a
a
a
a
c
b
a
a
a
a
...

Si j'ai une série de 30 a (ou moins) à la suite je supprime ces lignes si non je les conserves. Après avori essayer LAG ou de réaliser des sommes comme ici:

Code :
1
2
3
4
5
6
DATA Essai1; SET Essai;
retain som 0;
IF Var1 = "a" then som+1;
else som=0;
IF som >29 AND som <31 then indice=_N_;
run;
Je me retrouve bloqué ...

Merci d'avance
Guitouf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 17h47   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Je n'ai que des idées compliquées pour gérer ton problème.
Voici une solution en plusieurs étapes :
1) créer un identifiant de séries continues de la même valeur. Ce sera un identifiant unique : dans ton jeu de données, 1 pour la 1e série de A, puis 2 pour C, puis 3 pour B, puis 4 pour la 2e série de A, etc.
2) avec du SQL, calculer le nombre d'observations par série et filtrer uniquement les séries d'au moins x observations (filtre HAVING).
Code :
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
DATA work.test ; /* jeu d'essai */
INPUT var1 $ ;
DATALINES ;
a
a
a
a
c
b
a
a
a
a
;
RUN ;
DATA work.test2 ; /* identifiant de bloc */
  SET work.test ;
  BY var1 NOTSORTED ; /* ==> FIRST.VAR1 est vrai quand on démarre une nouvelle série */
  RETAIN idSerie 0 ;
  IF FIRST.var1 THEN idSerie=idSerie+1 ;
RUN ;
PROC SQL ;
  CREATE TABLE work.series AS
    SELECT *
	FROM work.test2
	GROUP BY idSerie
	HAVING COUNT(*) > 3 /* COUNT(*) ==> nb de lignes */
  ;
QUIT ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/06/2011, 20h38   #3
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
solution alternative (ça reste un peu tordu...)

Code :
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
 
DATA work.test ; /* jeu d'essai */
INPUT var1 $ ;
DATALINES ;
a
a
a
a
a
a
a
a
a
c
a
a
a
b
a
a
a
a
a
a
a
;
RUN ;
 
DATA work.test2(keep=var1 serie) work.test3 (keep=idserie serie);
  SET work.test ;
  BY var1 NOTSORTED ;
  IF FIRST.var1 THEN do ;
      idSerie=1 ;
	  serie+1;
  end ;
  else idSerie+1;
  output test2;
  IF last.var1 then output test3 ;
RUN ;
 
DATA test4 ;
merge test2 test3;
BY serie;
IF idserie <=5 then DELETE;
run;
dans mon cas, si la série n'est pas au moins de longueur 5 alors, on ne la conserve pas.

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/06/2011, 16h07   #4
Invité de passage
 
Homme
Ingénieur/Statisticien
Inscription : juin 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur/Statisticien
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 6
Points : 3
Points : 3
Merci beaucoup pour vos solutions, les deux méthodes fonctionnent parfaitement.
Guitouf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h59.


 
 
 
 
Partenaires

Hébergement Web