(Re)(re)bonjour,
dernier message de la journée, ne vous inquiétez pas
je poste maintenant car demain c férié donc je n'aurai plus accès à mon code.
après avoir tenté d'imbriquer une étape data dans une étape data - ce qui en brut n'est pas possible mais le devient grace à call execute - merci Bruno - je tente d'imbriquer une macro dans une macro.
je sais que c'est possible car je l'ai déjà fait sauf qu'aujourd'hui, j'ai envie de tester des trucs de ouf.
je veux imbriquer la macro X dans la macro X.
mais j'ai 2 problèmes:
1. ça tourne en boucle !
2. au cas où vous arriveriez à ne plus le faire tourner en boucle, je ne récupère pas mes données en sortie car j'utilise les memes datasets donc ils s'ecrasent. or moi, je voudrais qu'ils se concatènent.
voici l'explication de la situation globale:
j'ai un dataset X de plusieurs milliers de lignes et une seule colonne.
j'ai un dataset Y de plusieurs centaines de lignes et une seule colonne.
le but est de trouver le mot de Y le plus proche pour chacune des lignes de X.
donc je fais passer la fonction sas en essayant de croiser toutes les lignes de X avec toutes les lignes de Y.
dans un premier temps, j'ai transposé mon dataset Y pour avoir tout en une seule ligne.
dans un second temps, je prend la première ligne du dataset X que je fusionne avec le dataset Y transposé.
ça me donne un dataset d'une seule ligne et plusieurs colonnes. Voici les colonnes:
- TermToCode (issue du dataset X)
- col1 (issue du dataset Y transposé)
- col2 (issue du dataset Y transposé)
- col3 (issue du dataset Y transposé)
...
Je calcule res1, res2, ... qui est la distance entre TermToCode et col1/col2/...
Le but du programme est d'associer TermToCode soit à col1 soit à col2 soit à col3...
Le choix de col1, col2, col3 ... se fait en fonction de res1, res2, res3, ...
Le choix de res1, res2, res3 ... se fait en fonction de la valeur de ces variables: c'est la valeur minimum qui gagne.
si min(of res1-res...) est la valeur contenue dans res1 alors créer dataset contenant TermToCode et col1 et res1
si min(of res1-res...) est la valeur contenue dans res2 alors créer dataset contenant TermToCode et col2 et res2
si min(of res1-res...) est la valeur contenue dans res3 alors créer dataset contenant TermToCode et col3 et res3
donc à la fin, j'aimerai que tous ces mini datasets d'une ligne et trois colonnes soient mis bout à bout pour me créer un giga dataset, avec 3 colonnes (TermToCode, col et res) et les milliers d'observations du dataset X d'origine.
Je vous mets donc mon code ci dessous avec les endroits où ça me pose souci.
Merci à vous de m'avoir lue jusqu'ici et merci d'avance pour votre aide.
Si vous pensez que je m'y prends mal pour ce que je veux faire et qu'il y a un autre moyen plus simple ou plus performant ou les 2 à la fois, n'hésitez pas à m'en faire part.
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 /* datasetSource correspond au dataset X */ /* datasetTemplate correspond au dataset Y */ %macro CrossData(datasetSource,datasetTemplate); data UniqueCase; set &datasetSource; where id=1; run; data MixSourceTemplate; merge UniqueCase &datasetTemplate; by id; run; data DistMix; set MixSourceTemplate; array CompareData {*} termToCode col1-col30; array res (*) res0-res30 ; do i=2 to dim(CompareData) ; res[i]=complev(CompareData[1],CompareData[i]); if CompareData[i]="" then do; res[i]="999999999"; end; end ; drop i; run; data DistMixInter; set DistMix; Closest=min(of res1-res30); array TabRes{*} res1-res30; array TabCol{*} col1-col30; do i=1 to dim(TabRes); if TabRes[i]=Closest then do; Winner=TabCol[i]; end; end; drop i; run; data DistMixFinal (keep= TermToCode Winner Closest); set DistMixInter; run; /* coller les uns aux autres les datasets d'une ligne */ data &datasetSource; set &datasetSource; if id=1 then delete; run; data &datasetSource; set &datasetSource; id=_N_; run; %CrossData(&datasetSource,&datasetTemplate); /* tourne en boucle */ %mend;
Partager