2010-04-05 8 views
0

Une petite question, j'ai données du genre suivant:variables de comptage par observation par mois à Sas

Ticker _ date _ Fem Analyst (mannequin 1 si vrai) ___ Les variables de ce mois comme le bêta

AA _ _ 04.01.2001 1 ___ 0,61

AA _ _ 04.05.2001 1 ___ 0,62

AA _ _ 04.08.2001 1 ___ 0,63

AA _ _ 05.01.2002 1 ___ 0,7

AA _ _ 05.04.2002 1 ___ 0,71

AA _ _ 07.08.2002 0 ___ 0,8

AA _ _ 04.07.2003 1 ___ 0,4

et ainsi de suite .. Ce que je veux recevoir est la suivante:

Ticker _ Date de Nombre d'analyste fem Nombre d'analystes Hommes _ total ___Variables

AA _ 04/2001 0 _ ___ 3 0,63

AA _ 05/2002 0 _ ___ 2 0,71

AA _ 07/2002 1 _ 1 ___ 0,8

AA _ 04/2003 0 _ Donc, un algorithme de comptage qui me permet de compter le nombre de femmes et de mal L'analyste pour une entreprise donnée par mois (en utilisant la variable fictive de sexe 0 ou 1) et supprime toutes les observations pour ce mois sauf la plus récente (par exemple pour 08/04/01 cela devient 04/01 avec 0,63 qui est le plus récent observation pour beta pour 04/01 pour la société AA) L'exemple explique tout cela je suppose?

Des idées?

+0

Mon mauvais, n'a pas vraiment pensé à cela. Je suis allé à travers mes questions et vérifié chaque réponse valide! – John

Répondre

1

Vous voudrez peut-être quelque chose comme ceci:

/* Create the month variable into a string YYYY/MM */ 
data analysts0; 
    set <your data>; 
    format month $7.; 
    month=cats(year(date),'/',put(month(date),z2.)); 
run; 
/* Sort so you can do the by processing required for counting */ 
proc sort data=analyst0 out=analyst1; 
    /* You need to include the date in the sort so the most recent is last */ 
    by ticker month date; 
run; 
/* Count */ 
data count; 
    retain n_fem n_male 0; 
    set analyst1; 
    by ticker month; 
    if first.ticker of first.month then do; 
     n_fem=0; 
     n_male=0; 
    end; 
    else do; 
     if gender=1 then n_fem+1; 
     else if gender=0 then n_male+1; 
     else put 'Huh?'; 
    end; 
    /* this outputs only the values you need.*/ 
    if last.ticker or last.month then output; 
run; 

Cela devrait vous donner l'idée générale - Je n'ai pas accès à SAS en ce moment je ne peux pas vérifier le code.Voir la documentation pour retenir et en traitant dans l'étape de données pour plus de détails.

+0

Ugh, cette chaîne est un peu difficile pour moi. J'ai essayé: analyste de données0; ensemble final; format mois 7 $. mois = chats (année (recdats), '/', put (mois (recdats), z2.)); course; avec recdats étant du type date9 "21jan2001" et "final" l'ensemble de données. Je reçois une erreur: ERREUR 85-322: Attendre un nom de format. ERREUR 76-322: Erreur de syntaxe, instruction sera ignorée. C'est ce que mes données ressemble à: http://i40.tinypic.com/2d2iwy.png Vive bien! – John

+0

@John, il semble que j'ai manqué quelques points-virgules ... Je vais éditer la réponse. –

+0

@John, j'ai légèrement modifié le code. Il y a un point-virgule manquant dans le code que vous avez fourni dans le commentaire, l'instruction de format doit être: format mois $ 7 .; Aussi, je pense que la fonction chats n'est disponible que sur SAS 9, donc vous pourriez vouloir le remplacer par trim (left()) - appels si vous ne disposez pas de chats. –