Voici un exemple simple que j'ai proposé. Il y a 3 joueurs ici (ID est 1,2,3) et chaque joueur obtient 3 tentatives au jeu (tentative de 1,2,3).
1 1 100 1 2 200 1 3 . 2 1 150 2 2 . 2 3 . 3 1 60 3 2 . 3 3 .
5 Réponses :
Vous pouvez résoudre ce problème en créant d'abord une table dans laquelle vous avez la structure que vous souhaitez voir: pour chaque identifiant trois tentatives. Cette structure peut ensuite être jointe à une "join gauche" à votre table "avoir" pour obtenir les scores réels s'ils existent et manquent une variable si elles ne le font pas.
/* Create table with all ids for which the structure needs to be created */ proc sql; create table ids as select distinct id from have; quit; /* Create table structure with 3 attempts per ID */ data ids (drop = i); set ids; do i = 1 to 3; attempt = i; output; end; run; /* Join the table structure to the actual scores in the have table */ proc sql; create table want as select a.*, b.score from ids a left join have b on a.id = b.id and a.attempt = b.attempt; quit;
Malheureusement, cette réponse ne résout pas le problème dans une étape de données unique. J'ai fourni une solution mise à jour ci-dessous.
Un tableau des tentatives possibles croisées avec les identifiants distincts laissés à gauche dans les données produira le jeu de résultats souhaité.
Exemple: P>
data have; infile datalines delimiter=","; input id attempt score; datalines; 1,1,100 1,2,200 2,1,150 3,1,60 ; data attempts; do attempt = 1 to 3; output; end; run; proc sql; create table want as select each_id.id, each_attempt.attempt, have.score from (select distinct id from have) each_id cross join attempts each_attempt left join have on each_id.id = have.id & each_attempt.attempt = have.attempt order by id, attempt ;
Malheureusement, cette réponse ne résout pas le problème dans une étape de données unique. J'ai fourni une solution mise à jour ci-dessous.
mise à jour: je l'ai compris.
Voici une alternative Data CODE> STEP, A DOW EM> WAY:
data want;
do until (last.id);
set have;
by id;
output;
end;
call missing(score);
do attempt = attempt+1 to 3;
output;
end;
run;
Si les observations absentes ne sont qu'à la fin, vous pouvez simplement utiliser quelques relevés de sortie et une boucle de sortie. Donc, écrivez chaque observation telle qu'elle est lue et si la dernière n'est pas la tentative 3, ajoutez plus d'observations jusqu'à ce que vous obteniez la tentative 3.
data want2; set have end=eof; by id ; if not eof then set have (firstobs=2 keep=attempt rename=(attempt=next)); if last.id then next=3+1; output; score=.; do attempt=attempt+1 to next-1; output; end; drop next; run;
N'est-ce que les dernières tentatives qui peuvent être manquantes? Ou est-il possible que la tentative 1 soit absente mais tentative 2 ou 3 est là?