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 05/04/2011, 09h54   #1
Invité régulier
 
Inscription : juin 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 40
Points : 8
Points : 8
Par défaut Concaténation selon critère

Bonjour à tous,

J'ai un problème en SAS ou plutot besoin d'aide!
J'ai un tableau du style :

Id N° Distance
1 a 10
1 b 15
1 c 23
2 b 11
2 d 0.5
...

Je veux obtenir une liste concaténé des numéros et distances, dans le style :

Id Liste_N° Liste_Dist
1 a,b,c 10,15,23
2 b,d 11,0.5

J'imagine qu'il faudrait un tableau et concaténer dans le cas où l'id est le meme mais je ne vois pas comment faire concrétement en terme de code.

Merci d'avance.
JimJames23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h16   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Bonjour,
Une des solutions parmi tant d'autres...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATA TEST;
INPUT
Id NUM $ Distance;
cards;
1 a 10
1 b 15
1 c 23
2 b 11
2 d 0.5
RUN;
 
PROC TRANSPOSE DATA=TEST OUT=distance(DROP=_NAME_) prefix=distance;
VAR  Distance;
BY Id;
RUN;
PROC TRANSPOSE DATA=TEST OUT=NUM(DROP=_NAME_) prefix=NUM;
VAR  NUM;
BY Id;
RUN;
DATA TRANSPOSE;
MERGE NUM distance;
BY ID;
RUN;
Bonne journée!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/04/2011, 10h35   #3
Invité régulier
 
Inscription : juin 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 40
Points : 8
Points : 8
Tout d'abord merci pour ta réponse, elle me satisfait à 99% dans le sens où je voudrais juste une liste des "n" distances plutot que n colonnes des distances.

Du genre 10,12,13,14 plutot que 10 12 13 14
Est ce que c'est possible?

Merci

Edit : Plus exactement avec la table que je viens de créer grace à toi :
Id N°1 N°2 Dist1 Dist2
1 a b 10 15
2 c a 7 8

Je voudrais :
Id Dist
1 a(10), b(15)
2 c(7), a(8)

Je ne sais pas si c'est possible sous SAS.
JimJames23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h44   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par JimJames23 Voir le message
Tout d'abord merci pour ta réponse, elle me satisfait à 99% dans le sens où je voudrais juste une liste des "n" distances plutot que n colonnes des distances.

Du genre 10,12,13,14 plutot que 10 12 13 14
Est ce que c'est possible?

Merci
Les 1% pour te satisfaire

Code :
1
2
3
4
5
6
DATA TRANSPOSE;
MERGE NUM distance;
BY ID;
NUM=(compress(NUM1!!","!!NUM2!!","!!NUM3));
distrance=(compress(distance1!!","!!distance2!!","!!distance3));
RUN;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h44   #5
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
Voici une solution sans transposer.
Le RETAIN est indispensable pour mémoriser la valeur de l'observation précédente et l'augmenter. CATX existe à partir de SAS 9. Si tu as SAS 8, il faudra bricoler avec les fonctions LEFT et TRIM et des concaténations || ou !!.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATA TEST;
INPUT
Id NUM $ Dist ;
cards;
1 a 10
1 b 15
1 c 23
2 b 11
2 d 0.5
RUN;
DATA work.res (DROP=num dist) ;
  SET work.test ;
  BY id ; /* attention à trier au préalable ! */
  RETAIN liste_num liste_dist ;
  LENGTH liste_num liste_dist $ 1000 ;
  IF FIRST.id THEN DO ; /* initialisation */
    liste_num = "" ;
	liste_dist = "" ;
  END ;
  liste_num = CATX(",",liste_num,num) ;
  liste_dist = CATX(",",liste_dist,dist) ;
  IF LAST.id THEN OUTPUT ; /* on conserve 1 ligne */
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/04/2011, 10h46   #6
Invité régulier
 
Inscription : juin 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 40
Points : 8
Points : 8
Citation:
Envoyé par MEGAMIND2 Voir le message
Les 1% pour te satisfaire

Code :
1
2
3
4
5
6
DATA TRANSPOSE;
MERGE NUM distance;
BY ID;
NUM=(compress(NUM1!!","!!NUM2!!","!!NUM3));
distrance=(compress(distance1!!","!!distance2!!","!!distance3));
RUN;
Ca me va mais le problème c'est que mon nombre de num et de distance est variable. Par exemple, pour l'id 1 je vais avoir 3 distances et pour l'id 5 , 10 distances...compress peut prendre un paramètre?
JimJames23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h54   #7
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par JimJames23 Voir le message
Ca me va mais le problème c'est que mon nombre de num et de distance est variable. Par exemple, pour l'id 1 je vais avoir 3 distances et pour l'id 5 , 10 distances...compress peut prendre un paramètre?
Il faut passer par des macros pour récuprer le nombre de colonnes maximale (et donc ne pas taper distance1,...). Dans ce cas, tu peux envisager la solution proposée par Olivier (je n'ai pas testé mais je lui fais confiance)
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 10h54   #8
Invité régulier
 
Inscription : juin 2010
Messages : 40
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 40
Points : 8
Points : 8
Grace à vos idées à tous les 2, j'ai reussi ca marche.

Merci beaucoup et bravo pour la rapidité.
JimJames23 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 05h26.


 
 
 
 
Partenaires

Hébergement Web