2010-07-09 11 views

Répondre

1

Vous ne savez pas exactement ce que vous essayez de faire. Mais si vous avez vos enregistrements classés par "xname", et pour chaque groupe de "xname" veut simplement faire une somme sur une valeur, vous pouvez essayer ce qui suit.

data sample; 

    input xname$1-6 myvalue; 

datalines;  
name01 5 
name01 1 
name02 3 
name02 8 
name02 4 
name03 7 
; 

data result; 
    set sample; 
    by xname; 

    retain s 0; 

    if first.xname then s=0; 
    s=s+myvalue; 
    if last.xname then output; 
run; 

proc print data=result; 
run; 

Cela permet de réinitialiser « s » pour chaque groupe de « xname » et sort le dernier enregistrement avec « s » mis à la somme des « myvalue » au sein du groupe. Le résultat ressemble à ceci:

Obs xname  myvalue  s 

1  name01  1  6 
2  name02  4  15 
3  name03  7  7 
+0

Merci, cela fonctionne! –

0

Ce genre de tâches peut être mieux gérée avec un modèle de programmation connu sous le nom DoW (alias Do boucle de Whitlock). Pour chaque sous-groupe, l'initialisation précède la boucle et la sortie d'observation après la boucle. Pouvez-vous voir comment cela fonctionne vraiment? Ce paper est ancien mais à lire absolument.

data sample; 
    input xname$1-6 myvalue; 
datalines;  
name01 5 
name01 1 
name02 3 
name02 8 
name02 4 
name03 7 
; 
run; 

proc sort data=sample; 
    by xname; 
run; 

data result; 
    if 0 then set sample; /* prep pdv */ 
    s = 0; 
    do until (last.xname); 
     set sample; 
     by xname; 
     s + myValue; 
    end; 
run; 

/* check */ 
proc print data=result; 
run; 
/* on lst 
Obs xname  myvalue  s 

    1  name01  1  6 
    2  name02  4  15 
    3  name03  7  7 
*/ 
+0

@ Chang Chung, dans votre commentaire, vous avez mis/* prep pdv * /. Est-ce que cela signifie d'obtenir les noms de variables uniquement à partir d'un ensemble de données échantillon? – Alph