2013-05-07 38 views
5

sto usando un set di dati, che è qualcosa di simile:Riempire i valori del bianco di una variabile con il valore precedente non vuota SAS 9.3

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
| sexe  | men | 10 | 
|   | female | 20 | 
| age  | 0-20 |  5 | 
|   | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

E vorrei soddisfare le celle "in bianco" con il precedente cella non vuota per ottenere qualcosa come questo.

Ho provato varie possibilità nel passaggio DATA principalmente con la funzione LAG(). L'idea era di leggere la riga precedente quando la cella era vuota e riempirla con quella.

DATA test; 
    SET test; 

    IF variable = . THEN DO; 
     variable = LAG1(variable); 
    END; 
RUN; 

E ho ottenuto

+----------+--------+-------+ 
| Variable | Level | Value | 
+----------+--------+-------+ 
|   | men | 10 | 
| sexe  | female | 20 | 
|   | 0-20 |  5 | 
| age  | 20-40 |  5 | 
|   | 40-60 | 10 | 
|   | >60 | 10 | 
+----------+--------+-------+ 

Il problema era la buona stringa non è sempre e solo una riga in alto. Ma non capisco perché SAS abbia lasciato in bianco la prima e la linea 3d. Non ha dovuto modificare questa riga perché ho detto "If variable =.". So come farlo in Python o in R con un po 'di ciclo, ma non ho trovato una buona soluzione in SAS.

Ho provato a inserire la stringa all'interno di una variabile con "CALL SYMPUT" e anche con "RETAIN" ma non ha funzionato.

Ci deve essere un modo semplice ed elegante per farlo. Qualche idea?

+0

Domanda utile. Molte grazie. – stan

risposta

18

Non è possibile utilizzare il LAG all'interno di un IF e ottenere quel risultato: il LAG non funziona come si pensa. RETAIN è il modo corretto che direi:

DATA test; 
    SET test; 
    retain _variable; 
    if not missing(variable) then _variable=variable; 
    else variable=_variable; 
    drop _variable; 
RUN; 

Lag in realtà non va al record precedente e ottiene il suo valore; ciò che fa è impostare una coda, e ogni volta che il LAG viene chiamato, toglie un record dalla parte anteriore e aggiunge un record alla parte posteriore. Ciò significa che se il LAG si trova all'interno di un blocco condizionale, non verrà eseguito per la falsa condizione e non si ottiene la coda. È possibile utilizzare le funzioni IFN e IFC, che valutano sia condizioni vere che false, indipendentemente dal valore booleano, ma in questo caso RETAIN è probabilmente più semplice.

+0

Funziona perfettamente e le spiegazioni sono molto chiare! Grazie mille Joe! È la seconda volta che mi aiuti e così in fretta. Come stai? Tracciare tutte le domande via RSS? – jomuller

+0

RSS è in realtà piuttosto lento da aggiornare (ma, sì, in alcuni casi); ti è appena capitato di chiederlo poco dopo aver risposto ad un'altra domanda :) – Joe

+0

Risposta utile. Molte grazie. – stan

Problemi correlati