2017-07-19 2 views
0

Certaines des valeurs de mes variables de réponse sont nulles. Je veux trouver quelle que soit la valeur minimale positive, diviser par 2 et ajouter ce montant à toutes les valeurs d'origine avant de prendre le journal. S'il vous plaît, aidez-moi à faire ça. C'est mon code actuel mais ça ne me semble pas correct.Comment "ajouter la moitié de la valeur positive minimum (parmi toutes) à toute la valeur de réponse" avant de prendre le journal

data dat; set dat; 
    lvar = log(var + (min(var)/2)); 
run; 

Et voici quelques exemples de données

data dat; 
cards; 
a var 
1 0 
2 5 
3 6 
4 7 
5 10 
6 2 
7 0 
8 4 
9 0 
; 

Merci pour toute suggestion

+0

Pouvez-vous utiliser SQL au lieu d'une étape de données? Le code fonctionnera dans SQL mais pas une étape de données, parce que la fonction MIN fonctionne différemment entre les deux. La façon dont vous l'utilisez maintenant, c'est comment cela fonctionne dans PROC SQL. – Reeza

Répondre

2

Dans une étape DATA, vous pouvez le faire avec une boucle double MdM. Au lieu de s'appuyer sur la boucle d'étape DATA implicite, vous faites en sorte que la boucle soit explicite. Dans une étape DATA, vous lisez une fois les données pour trouver le minimum, puis vous le lisez une seconde fois pour calculer les enregistrements lvar et de sortie.

Quelque chose comme:

data want; 

    *loop through all records, to find the minimum; 
    do until(eof); 
    set dat end=eof; 

    if var ne 0 then minvar=min(var,minvar); 
    end; 
    eof=0; *reset eof flag; 


    *loop through the records again, computing lvar; 
    *and outputting each record; 
    do until(eof); 
    set dat end=eof; 
    lvar=log(var+minvar); 
    put (_all_)(=); 
    output; 
    end; 
run;