Bonjour,
J'aimerais savoir comment ajouter une ligne à ma table en fonction des autres.
2 A 4 B 5 C 7 D 3 E
Comment puis - je rajouter ces lignes :
6 AB 8 CE 21 Total
Bonjour,
J'aimerais savoir comment ajouter une ligne à ma table en fonction des autres.
2 A 4 B 5 C 7 D 3 E
Comment puis - je rajouter ces lignes :
6 AB 8 CE 21 Total
Salut,
Ce sont uniquement ces lignes que tu veux ajouter ? Cela me semble compliqué mais tu peux te servir de la fonction LAG :
Pour le total tu peux le faire avec une PROC SQL.
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 data __test; input num char $; cards; 2 A 4 B 5 C 7 D 3 E ; run; data __test2; set __test (where=(num ne 7)); num2 = num+lag(num); char2 = compress(lag(char)||char); run;
alers
Merci pour votre réponse.
Ce sont juste des lignes effectivement. Je ne pensais pas que cela aurait été si compliqué.
Une proc SQL ? Une fonction me permettrait d'obtenir ça, je vais y jeter un oeil alors.
Le soucis avec cette méthode étant que cela m'ajoute deux autres colonnes, ce qui n'est pas ce à quoi j'essaye d'arriver.
Éventuellement, je pourrais isoler ces données dans une table et concaténer le tout mais bon, j'imagine qu'il y a plus simple.
N'y a t-il pas moyen de passer par un update dans une proc sql ?
Bonjour,
Personnellement je ne comprend pas ce que tu souhaites obtenir... Tu veux rajouter des lignes uniquement pour AB et CE ou est-ce qu'il faut faire tous les couples possibles ? Est-ce que tu as besoin d'une table que tu pourras manipuler ou juste un tableau par une proc report suffira ?
J'ai généré la table ci dessus avec une proc sql.
J'aurais besoin de rajouter des lignes à cette table avec juste quelques couples que je définirais moi même. Ici, juste les couples AB et CE ainsi que ABCDE (Total). De façon à avoir ce genre de résultat.
2 A 4 B 5 C 7 D 3 E 6 AB 8 CE 21 Total
J'aimerais en sortie une table que je peux manipuler.
Bonjour,
C'est une possibilité :
Ward
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 data Test ; input num lettre $ ; retain grp ; if lettre in('A', 'C') then grp+1 ; cards ; 2 A 4 B 5 C 7 D 3 E ; run ; data Test1 (keep=num lettre) ; do until ( last.grp ) ; set Test end=fin ; total+num ; by grp notsorted ; output ; if first.grp then do ; Fnum=num ; Flet=lettre ; end ; if last.grp then do ; Lnum=num ; num=Lnum+Fnum ; Llet=lettre ; Lettre=cats(Flet, Llet) ; output ; end ; if fin then do ; num=total ; lettre='Total' ; output ; end ; end ; run ;
Très bien alors voici ce que je te propose :
Tu peux choisir les couples que tu souhaites obtenir dans la macro variable "couple" et le programme fera le reste !
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 data test; input num char $; cards; 2 A 4 B 5 C 7 D 3 E ; run; data _null_; set test; call symputx (char, num); run; %let couple =AB CE; data test2 (drop = p i); set test end=last; p + num; output; if last then do; do i=1 to countw(strip("&couple.")); char = scan(strip("&couple."),i); num = symget(substr(char,1,1)) + symget(substr(char,2,1)); output; end; char = 'Total'; num = p; output; end; run;
Bon courage!
Merci à tout les deux. Je ne suis pas contre une explication de vos codes, si possible étape par étape.
Le second contient d'ailleurs quelques erreurs selon ma log.
Pour le premier, comment puis - je me servir de la fonction Retain en sachant que ma table a été généré à l'aide d'autres tables et que je ne l'ai pas crée ainsi.
Voici la solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 data test ; set Tatable ; retain grp ; if lettre in('A', 'C') then grp+1 ; run ;
Merci, je vais tester ça.
Ceci étant, serais - ce possible d'avoir une petite explication du fonctionnement de ce code ? J'avais testé le précédent en entrant mes réelles valeurs et j'ai eu quelques soucis.
Lexplication me permettant de pouvoir les corriger par moi même
Bonjour,
J'ai adapté le code pour ta base en désactivant l'option KEEP afin de mieux voir le déroulement du programme sachant que FQuant et LQuant (F comme First, L comme Last) sont les variables prenant respectivement la 1ère valeur et la dernière valeur de la variable Quantity (Idem pour la variable Trx).
Ward
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 data Tatable ; input Trx$ Quantity ; cards ; GRA 2 GRB 4 GRC 5 GRD 7 GRE 3 ; run ; data test ; set Tatable ; retain grp ; if Trx in('GRA', 'GRC') then grp+1 ; run ; data Test1 ; *(keep=Trx Quantity) ; do until ( last.grp ) ; set Test end=fin ; Total+Quantity ; by grp notsorted ; output ; if first.grp then do ; FQuant=Quantity ; FTrx=Trx ; end ; if last.grp then do ; LQuant=Quantity ; Quantity=LQuant+FQuant ; LTrx=Trx ; Trx=catx('_', FTrx, LTrx) ; output ; end ; if fin then do ; Quantity=Total ; Trx='Total' ; output ; end ; end ; run ;
Bonjour,
Voici une option en Format très basique. En espérant que cela vous Aide.
Cordialement,
Véronique
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 *je crée le data set pour l'exemple; data one; x=2; y='A'; output; x=4; y='B'; output; x=5; y='C'; output; x=7; y='D'; output; x=3; y='E'; output; run; *je crée un data set contenant la valeur pour A+B; *je ne garde que les observations où on a A et B; *je crée de nouvelles variables tot_x et tot_y où j'applique un retain; *ainsi en ligne deux, je fais la somme de la ligne précédente (ligne 1) et de la ligne actuelle; *je ne garde que la dernière ligne; *j'identifie la dernière ligne au moyen de l'option end= ; *je choisi le nom eof pour end of file que je réutilise par la suite mais je peux choisir un autre nom; *je renomme et ne garde que les variables qui m'intéresse. data ab (drop=x y rename=(tot_x=x tot_y=y)); set one (where=(y in ('A','B'))) end=eof; length tot_y $5; retain tot_x 0 tot_y ' '; tot_x+x; tot_y=cats(tot_y,y); if eof then output; run; *je crée un data set contenant la valeur pour C+D (même méthode que précémment); data cd (drop=x y rename=(tot_x=x tot_y=y)); set one (where=(y in ('C','D'))) end=eof; length tot_y $5; retain tot_x 0 tot_y ' '; tot_x+x; tot_y=cats(tot_y,y); if eof then output; run; *je crée un data set contenant le total (même méthode que précémment); data tot (drop=x y rename=(tot_x=x tot_y=y)); set one end=eof; length tot_y $5; retain tot_x 0 tot_y ' '; tot_x+x; tot_y=cats(tot_y,y); if eof then output; run; *je mets les résultats bout à bout; data new; length x 8 y $5; set one ab cd tot; run; proc print data=new; run;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager