2012-04-06 5 views
-2

Je sais qu'il existe des questions similaires concernant les numéros de série, mais mon cas est un peu différent. Je dois attribuer un numéro de série en fonction de la variable de groupe. Maintenant, mes données sont triées par la variable de groupe. Les données suivantes ne sont qu'une partie de l'ensemble de données. Fondamentalement, je veux créer la variable "serial_num" qui assignent le numéro de série unique par le groupe comme montré ci-dessous.SAS: attribuer un numéro de série basé sur le groupe

Par exemple, lorsque groupe = 1, chacun a son propre numéro de série. Lorsque groupe = 2, il y a deux numéros de série identiques. J'espère que vous aurez le modèle en observant les données ci-dessous.

Merci d'avance.

serial_num group 
---------------- 
1   1 
2   1 
.   . 
.   . 
.   . 
7   2 
7   2 
8   2 
8   2 
.   . 
.   . 
.   .  
10   3 
10   3 
10   3 
11   3 
11   3 
11   3 
.   . 
.   . 
.   . 

Répondre

3

Une exigence étrange, mais voici une solution utilisant l'ancienne étape de données.

data output; 
    set input; 
    by group; 
    if first.group or c = group then do; 
     c = 0; 
     serial_num + 1; 
    end; 
    c + 1; 

    drop c; 
run; 
1

Une solution grossière utilisant l'IML. Principalement pour vérifier avec vous si elle correspond au modèle que vous voulez puis si nécessaire, je peux l'agrandir pour activer la saisie de données ou apporter des améliorations.

Remarque: y est le vecteur de numéro de série généré.

proc iml; 
x={1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4}; 
y=j(nrow(x),1,.); 

y[1,1]=1; 
j=1; 
do i=2 to nrow(y); 
    if y[i-x[i,1],1]=j then do; 
     j=j+1; 
     y[i,1]=j; 
    end; 
    else if x[i,1]^=x[i-1,1] then y[i,1]=y[i-1,1]+1; 
    else y[i,1]=y[i-1,1]; 
end; 
print y; 
quit; 
+1

Pour améliorer l'efficacité, vous pouvez utiliser l'astuce UNIQUE-LOC ou la fonction UNIQUEBY. Par exemple, voir http://blogs.sas.com/content/iml/2011/11/07/an-efficient-alternative-to-the-unique-loc-technique/ – Rick

+0

@Rick Merci. C'est une bonne lecture. –

+0

Merci! Eh bien, il y a un peu de problème. Il y a quatre groupes différents (1 à 4) et j'ai plus de 500 000 observations. – Ken

Questions connexes