2013-05-07 2 views
5

Używam zestawu danych, który jest czymś w rodzaju:Wypełnij puste wartości zmiennej z poprzedniego braku wartości pustej SAS 9,3

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

I chciałbym, aby spełnić „puste” komórki przy użyciu poprzedniego niepustą komórkę, aby uzyskać coś takiego.

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

Próbowałem różnych możliwości w kroku danych głównie za pomocą funkcji LAG(). Chodziło o to, aby przeczytać poprzedni wiersz, gdy komórka była pusta i wypełnić ją.

DATA test; 
    SET test; 

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

I uzyskano

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

Problem był dobry ciąg nie zawsze jest tylko jeden wiersz górny. Ale nie rozumiem, dlaczego SAS włożył puste w pierwszej i 3d linii. Nie musiałem modyfikować tej linii, ponieważ powiedziałem "If variable =.". Wiem, jak to zrobić w Pythonie lub w R z niektórymi pętlami, ale nie znalazłem dobrego rozwiązania w SAS.

Próbowałem umieścić ciąg wewnątrz zmiennej z "CALL SYMPUT", a także z "RETAIN", ale to też nie działało.

Musi to być prosty i elegancki sposób, aby to zrobić. Dowolny pomysł?

+0

Przydatne pytanie. Wielkie dzięki. – stan

Odpowiedz

18

Nie można używać LAG wewnątrz IF i uzyskać ten wynik - LGD nie działa tak, jak myślisz. RETAIN to poprawny sposób, który powiedziałbym:

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

Opóźnienie nie przechodzi do poprzedniego rekordu i nie ma wartości; to, co robi, to ustawianie kolejki i za każdym razem, gdy wywoływana jest LAG, zdejmuje ona rekord z przodu i dodaje rekord do tyłu. Oznacza to, że jeśli LAG znajduje się wewnątrz bloku warunkowego, nie zostanie wykonane dla warunku fałszywego, a ty nie dostaniesz kolejki. Możesz użyć funkcji IFN i IFC, które oceniają zarówno prawdziwe, jak i fałszywe warunki, niezależnie od wartości boolowskiej, ale w tym przypadku RETAIN jest prawdopodobnie łatwiejszy.

+0

Działa doskonale, a wyjaśnienia są bardzo jasne! Dziękuję bardzo Joe! Po raz drugi pomagasz mi i tak szybko. Jak się masz? Śledzenie wszystkich pytań przez RSS? – jomuller

+0

RSS jest dość powolny do aktualizacji (ale tak, w niektórych przypadkach); po prostu zdarzyło ci się to zapytać krótko po tym, jak odpowiedziałem na kolejne pytanie :) – Joe

+0

Przydatna odpowiedź. Wielkie dzięki. – stan