2017-06-29 4 views
-1

Supposons que je ces données lues dans SAS:Comment puis-je extraire les valeurs uniques d'une variable et leurs comptes dans SAS

Raw Data

Je voudrais énumérer chaque nom unique et le nombre de mois est apparu dans les données ci-dessus pour donner un ensemble de données comme ceci:

Frequency Data

J'ai regardé dans PROC FREQ, mais je pense que je dois faire cela dans une étape DATA, parce que je voudrais être en mesure de créer autre v ariables dans le nouvel ensemble de données et autrement être en mesure de manipuler les nouvelles données.

+0

Votre dernière phrase ne permet pas de donner une bonne réponse à cette question. Sans savoir quelles autres statistiques vous voulez, il est impossible de dire quelle est la meilleure méthode. Vous pouvez utiliser PROC MEANS/SQL/FREQ/TABULATE/SUMMARY/REPORT et bien sûr, une étape de données pour compter les nombres. – Reeza

+0

Oh ... J'ai oublié les tables de hachage, IML, DS2 ... et probablement d'autres méthodes. – Reeza

Répondre

0

Bien qu'il soit possible de le faire dans une étape de données, vous ne le feriez pas; vous utiliseriez proc freq ou similaire. Presque chaque PROC peut vous donner un ensemble de données en sortie (plutôt que d'imprimer simplement à l'écran).

PROC FREQ data=sashelp.class; 
    tables age/out=age_counts noprint; 
run; 

Vous pouvez ensuite utiliser cet ensemble de données de sortie (age_counts) comme entrée SET à une autre étape de données pour effectuer vos calculs supplémentaires.

+0

Merci; cela s'est avéré être le plus facile. Je n'avais pas réalisé qu'il était possible d'obtenir un ensemble de données. – StatsUndergrad

0

Vous pouvez également utiliser proc sql pour grouper la variable et en compter le nombre. Il peut être plus rapide que proc freq en fonction de la taille de vos données.

proc sql noprint; 
    create table counts as 
    select AGE, count(*) as AGE_CT from sashelp.class 
    group by AGE; 
quit; 
0

Si vous voulez le faire dans une étape de données, vous pouvez utiliser un objet Hash pour maintenir les valeurs comptées:

data have; 
do i=1 to 100; 
    do V = 'a', 'b', 'c'; 
     output; 
    end; 
end; 
run; 

data _null_; 
set have end=last; 
if _n_ = 1 then do; 
    declare hash cnt(); 
    rc = cnt.definekey('v'); 
    rc = cnt.definedata('v','v_cnt'); 
    rc = cnt.definedone(); 
    call missing(v_cnt); 
end; 

rc = cnt.find(); 
if rc then do; 
    v_cnt = 1; 
    cnt.add(); 
end; 
else do; 
    v_cnt = v_cnt + 1; 
    cnt.replace(); 
end; 

if last then 
    rc = cnt.output(dataset: "want"); 
run; 

Ceci est très efficace car il est une seule boucle sur les données . L'ensemble de données WANT contient les valeurs de clé et de compte.

0

étape de données:

proc sort data=have; 
    by name month; 
    run; 

    data want; 
    set have; 
    by name month; 
    m=month(lag(month)); 
    if first.id then months=1; 
    else if month(date)^=m then months+1; 
    if last.id then output; 
    keep name months; 
run; 

Pro Sql:

proc sql; 
    select distinct name,count(distinct(month(month))) as months from have group by name; 
quit;