6
votes

Comment trouver une valeur maximale de variable pour chaque observation unique dans le jeu de données "empilé"

Désolé pour le titre de visée.

Mon ensemble de données semble essentiellement comme ceci: xxx

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.

Tout retour serait grandement apprécié.

sas

0 commentaires

8 Réponses :


3
votes

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? XXX PRE>

Cela vous donnerait ce résultat: P>

Obs    myid    myvalue

 1       18       2   
 2      361       1   
 3      369       3   


0 commentaires

0
votes

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;


0 commentaires

9
votes

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): xxx

Découvrez le SAS en ligne Documentation Pour plus de détails sur Proc signifie ( http://support.sas.com/onlinedoc/913 /docmainpage.jsp ).


0 commentaires

1
votes

Vous pouvez essayer ceci:

PROC SQL;
CREATE TABLE CHCK AS SELECT MYID, MAX(MYVALUE) FROM SAMPLE
GROUP BY 1;
QUIT;


0 commentaires

0
votes

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;


0 commentaires

2
votes

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: xxx


0 commentaires

1
votes

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:

  1. Si votre jeu de données est déjà trié par ID, mais pas par X Dans chaque ID, vous pouvez toujours le faire dans une seule étape de données sans tri, à l'aide d'un MAX retenu dans chacun par groupe. Alternativement, vous pouvez utiliser Proc moyen (selon la réponse supérieure), mais avec un 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é>
    1. 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
      


0 commentaires

-1
votes

Un hachage multidata doit être utilisé si vous souhaitez que le résultat affiche chaque fort> 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>

Exemple code: strong> p>

Recherchez les identifiants associés à la valeur max de 40 variables numériques différentes. Le code est 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;


0 commentaires