0
votes

Comment ajouter des lignes avec des valeurs spécifiques manquantes dans une étape de données unique?

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   .

sas

1 commentaires

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à?


5 Réponses :


1
votes

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;


1 commentaires

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.



1
votes

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
  ;


1 commentaires

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.



0
votes

mise à jour: je l'ai compris. XXX


0 commentaires

0
votes

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;


0 commentaires

0
votes

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;


0 commentaires