Recopie de tables
Sélection de variables et d'observations

La recopie d'une table : Instruction SET

Comme nous l'avons vu précédemment, le programme :

DATA destination;
SET source;
RUN;

Crée une table destination dans laquelle on recopie le contenu de la table source.

La sélection de variables : Instructions KEEP et DROP

Il est possible de ne recopier que certaines variables de la table source, en utilisant les instructions et options KEEP et DROP.

Supposons que la table source possède 3 variables nommées v1, v2 et v3.
Les programmes suivants :

DATA destination;
SET source;
KEEP v1;
RUN;

DATA destination;
SET source (KEEP=v1);
RUN;

DATA destination;
SET source;
DROP v2 v3;
RUN;

DATA destination;
SET source (DROP=v2 v3);
RUN;

Ont tous pour effet de créer une table destination qui contient toutes les observations de la table source mais en ne gardant que la colonne v1.

Les deux premiers programmes utilisent les instructions KEEP et DROP, tandis que les deux suivants utilisent ces commandes en tant qu'options de l'instruction SET. Placé en option, le KEEP ou le DROP est exécuté au moment même de la recopie de la table, alors qu'en instruction, il est exécuté après. Si la différence ne se fait pas sentir dans le cas d'une simple recopie de table, comme ici, on verra plus loin un exemple ou elle devient capitale.

Le filtrage d'observations : Instructions WHERE, DELETE et OUTPUT

Il est possible de ne recopier que certaines observations de la table source.
Deux cas se présentent :

Cas 1 : On souhaite extraire les observations m à n

On utilise dans ce cas les options OBS= et FIRSTOBS= de l'instruction SET.

DATA destination;
SET source (firstobs=m obs=n);
RUN;

Crée une table destination qui contient les observations m à n de la table source.

Si l'option FIRSTOBS n'est pas précisée, la table est recopiée à partir de la 1ère observation. De même, si l'option OBS n'est pas précisée, la table est recopiée jusqu'à la dernière observation.

Cas 2 : On souhaite garder les observations vérifiant une certaine condition Cond

On utilise dans ce cas l'instruction WHERE :

DATA destination;
SET source;
WHERE [Cond];
RUN;

Attention : L'instruction WHERE doit être unique dans l'étape DATA.
Par exemple, on écrira :

DATA destination;
SET source;
WHERE v1>0 AND v2="a";
RUN;

Et non :

DATA destination;
SET source;
WHERE v1>0;
WHERE v2="a";
RUN;

En effet, dans ce programme, la seconde instruction WHERE écrase la première !

De manière équivalente, on peut utiliser les instructions DELETE (efface l'observation courante) et OUTPUT (force l'écriture de l'observation courante dans la table) dans une boucle si alors :

DATA destination;
SET source;
IF [Cond] THEN OUTPUT;
RUN;

DATA destination;
SET source;
IF not [Cond] THEN DELETE;
RUN;

Là encore, dans un cadre simple comme celui-ci, ces méthodes sont équivalentes. On verra par la suite qu'elles ne le sont pas toujours.

L'instruction OUTPUT est en particulier très utile lorsqu'on souhaite "découper" une table en plusieurs sous-tables. Par exemple, je dispose d'une table source dont une des variables est le sexe de l'individu, et je souhaite obtenir deux tables, l'une contenant les données pour les hommes, et l'autre pour les femmes.
J'écris alors le programme suivant :

DATA femmes hommes;
SET source;
IF sexe=1 THEN OUTPUT hommes;
ELSE OUTPUT femmes;
RUN;

Remarques sur l'instruction SET

Au sujet de ces deux dernières remarques, on se reportera au paragraphe "Concaténation et fusion de tables".