Génération de variables

L'opérateur d'affectation est le =. Les calculs les plus simples (addition, soustraction, multiplication, division, exponentiation) se font simplement par invocation de l'opérateur approprié.
Il n'est pas nécessaire de déclarer les variables en SAS. Tout objet du programme qui, de par sa nature syntaxique, est interprété comme un nom de variable, est inséré dans le vecteur de travail en tant que nouvelle variable.
On étudie ci-dessous deux cas particuliers de calcul de variables.

Générer des distributions aléatoires

On souhaite créer une table ex nihilo, qui contienne 100 réalisations d'une variable aléatoire réelle x suivant une loi normale centrée réduite.
On écrit le programme suivant :

DATA normale;
DO i=1 TO 100;
x = rannor(0);
OUTPUT;
END;
RUN;

La table normale ainsi créée contient deux variables : i (numéro d'itération) et x (variable suivant une loi normale centrée réduite, obtenue).
L'instruction OUTPUT est ici indispensable. Si on l'omet, seule la dernière observation est enregistrée dans la table. Ceci tient au fait que SAS n'assimile pas une étape d'une boucle à une observation. Ainsi, dans le programme suivant :

DATA test;
SET source;
DO i=1 TO 100;
[Bloc d'instructions];
END;
RUN;

Le bloc d'instructions est effectué 100 fois pour chaque observation de la table source !

Calculer des cumulés

On a vu dans la présentation de l'étape DATA que cela n'est pas immédiat, la raison en étant que le vecteur de travail est réinitialisé à chaque nouvelle observation calculée.
Pour y remédier, il faut demander à SAS de se souvenir de la valeur précédente prise par la variable. Cela se fait grâce à l'instruction RETAIN :

RETAIN mavariable <valeur_initiale> ;

La syntaxe de RETAIN prévoit la définition (facultative) d'une valeur initiale pour mavariable, valeur qui lui sera affectée lors de sa première apparition dans le programme. Si l'on souhaite calculer un cumulé, on choisira cette valeur égale à 0.

On reprend le cas étudié dans le paragraphe "La logique ligne par ligne de l'étape DATA" en ajoutant une instruction RETAIN :

DATA maLib.a ;
RETAIN total 0;
SET maLib.cours ;
Coefficient=coefficient+1 ;
Un=1 ;
Total=total+coefficient;
RUN ;

Cette fois, la variable total contient bien le cumulé des coefficients :

table malib.a
totalcoefficientv1v2un
22461
53351
94541

Remarque :
L'instruction RETAIN ne peut s'appliquer qu'à une nouvelle variable !

Calcul de cumulés sur sous-groupes

On reprend cette fois la table ab issue de l'interclassement des tables {nom,note} du paragraphe "Concaténation et fusion de tables". On souhaite calculer le cumulé des notes pour chaque élève (même si cela n'a pas grand sens).
Comme précédemment, on utilise l'instruction RETAIN.
On a besoin de plus de repérer la première et la dernière occurrence de chaque nom d'élève. Pour cela, on utilise FIRST et LAST :

DATA ab;
SET ab;
BY nom;
RETAIN cumule;
IF first.nom THEN cumule=0;
cumule=cumule+note;
RUN;

On obtient le résultat suivant :

table ab
nomnotecumule
tata1818
titi1414
titi1024
toto1212
tutu88

Calcul du numéro d'observation

Cela peut être vu comme un calcul de cumulé, puisque le numéro d'observation est incrémenté de 1 à chaque ligne. On peut donc écrire, en utilisant l'instruction de sommation :

DATA destination;
SET source;
RETAIN num_obs 0;
num_obs + 1;
RUN;

Cependant, il existe en SAS une variable notée _n_ qui désigne le nombre d'itérations réalisées de l'étape DATA en cours. Dans le cas simple d'une recopie de table, cette grandeur correspond exactement au numéro de l'observation courante. On peut donc simplement écrire :

DATA destination;
SET source;
num_obs = _n_ ;
RUN;