Désolé pour le titre de visée.
Mon ensemble de données semble essentiellement comme ceci: p> Ce que je veux, c'est de trouver la valeur max de x pour chaque identifiant. Dans ce jeu de données, ce serait 2 pour id = 18 et 3 pour id = 361. P> Tout retour serait grandement apprécié. P> p>
8 Réponses :
Je ne comprends pas tout à fait votre exemple. Je ne peux pas imaginer que l'ensemble de données d'entrée ait vraiment toutes les valeurs d'une observation. Signifiez-vous plutôt quelque chose comme ça? Cela vous donnerait ce résultat: P> Obs myid myvalue
1 18 2
2 361 1
3 369 3
Utilisez un Proc code> avec la déclaration code> par code>. Par exemple,
data sample;
input myid myvalue;
datalines;
18 1
18 1
18 2
18 1
18 2
369 2
369 3
369 3
361 1
;
run;
proc sort data=sample;
by myid;
run;
proc means data=sample;
var myvalue;
by myid;
run;
Proc signifie avec une déclaration de classe (vous n'avez donc pas à trier) et demander la statistique Max est probablement l'approche la plus simple (non testée): Découvrez le SAS en ligne Documentation Pour plus de détails sur Proc signifie ( http://support.sas.com/onlinedoc/913 /docmainpage.jsp ). P> p>
Vous pouvez essayer ceci:
PROC SQL; CREATE TABLE CHCK AS SELECT MYID, MAX(MYVALUE) FROM SAMPLE GROUP BY 1; QUIT;
Je trierais simplement par X et ID mettant la valeur la plus élevée pour chaque identifiant en haut. NODUPKEY supprime chaque duplicata ci-dessous.
proc sort data=yourstacked_data out=yourstacked_data_sorted; by DECENDING x id; run; proc sort data=yourstacked_data NODUPKEY out=top_value_only; by id; run;
Si vous souhaitez conserver tous les deux enregistrements et la valeur max de X par ID ID, j'utiliserais soit le procureur AVIOCH suivi d'une instruction MERGE, ou vous pouvez trier les données par ID et descendre x d'abord, puis utiliser La déclaration de retenue pour créer le max_value directement dans le DataStep:
Quelques options plus excédentaires susceptibles d'intéresser quiconque a besoin de le faire avec un très grand jeu de données, où la performance est plus préoccupante:
par code> relève plutôt que par une omission code> code> instruction - cela réduit l'utilisation de la mémoire. Li>
ol> xxx pré>
- Même si votre jeu de données n'est pas trié par ID, vous pouvez toujours le faire dans une étape de données, sans le trier, à l'aide d'un objet de hachage pour garder une trace de la valeur maximale x que vous avez trouvée pour chaque identifiant. le long de. Ce sera un peu plus rapide que
procurent code> et utilisera généralement moins de mémoire, car Proc signifie que divers calculs dans l'arrière-plan ne sont pas nécessaires dans le jeu de données de sortie. LI>
OL> memory 8706.90k
OS Memory 35760.00k
Un hachage multidata doit être utilisé si vous souhaitez que le résultat affiche chaque fort> Exemple code: strong> p> Recherchez les identifiants associés à la valeur max de 40 variables numériques différentes.
Le code est ID code> à max
valeur code>. C'est-à-dire que pour les cas où plus d'un
ID code> se trouve avoir une valeur max code> code>
Proc DS2 code> Programme de données. P>
data have;
call streaminit(123);
do id = 1 to 1e5; %* 10,000 rows;
array v v1-v40; %* 40 different variables;
do over v; v=ceil(rand('uniform', 2e5)); end;
output;
end;
run;
proc ds2;
data _null_;
declare char(32) _name_ ; %* global declarations;
declare double value id;
declare package hash result();
vararray double v[*] v:; %* variable based array, limit yourself to 1,000;
declare double max[1000]; %* temporary array for holding the vars maximum values;
method init();
declare package sqlstmt s('drop table want'); %* DS2 version of `delete`;
s.execute();
result.keys([_name_]); %* instantiate a multidata hash;
result.data([_name_ value id]);
result.multidata();
result.ordered('ascending');
result.defineDone();
end;
method term();
result.output('want'); %* write the results to a table;
end;
method run();
declare int index;
set have;
%* process each variable being examined for 'id at max';
do index = 1 to dim(v);
if v[index] > max[index] then do; %* new maximum for this variable ?
_name_ = vname(v[index]); %* retrieve variable name;
value = v[index]; %* move value into hash host variable;
if not missing (max[index]) then do;
result.removeall(); %* remove existing multidata items associated with the variable;
end;
result.add(); %* add new multidata item to hash;
max[index] = v[index]; %* track new maximum;
end;
else
if v[index] = max[index] then do; %* two or more ids have same max;
_name_ = vname(v[index]);
value = v[index];
result.add(); %* add id to the multidata item;
end;
end;
end;
enddata;
run;
quit;
%let syslast=want;