2014-12-15 16 views
5

Zawsze uważałem, że zmienne są ustawione na brakujące dla każdej iteracji kroku danych. Jednak w poniższym kodzie wygląda na to, że wartość, którą ta zmienna ma na samym początku, zachowuje. Nie rozumiem, dlaczego tak się dzieje?SAS. Czy zmienne są ustawione na brak przy każdej iteracji kroku danych?

data one; 
input x $ y; 
datalines; 
a 10 
a 13 
a 14 
b 9 
; 
run; 

data two; 
input z; 
datalines; 
45 
; 
run; 

data test; 
if _n_ = 1 then set two; /* when _n_=2 the PDV assigns missing values, right ? */ 
set one; 
run; 
proc print; 
run; 

Wynik jest

z  x  y 
    45  a 10 
    45  a 13 
    45  a 14 
    45  b  9 

Spodziewałem się uzyskać to

z  x  y 
    45  a 10 
    .  a 13 
    .  a 14 
    .  b  9 

Odpowiedz

3

SAS robi nie zresetować wartości PDV dla - SET, łączyć, modyfikować lub UPDATE sprawozdania. Ponieważ używasz instrukcji SET, więc SAS nie resetuje go.

if _n_ = 1 then set two; 

http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#p08a4x7h9mkwqvn16jg3xqwfxful.htm

Read - Egzekucja Faza - Pointer 5

http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/viewer.htm#a001290590.htm

http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a000961108.htm

+0

OK, rozumiem. SAS nie zamierza zresetować wartości zmiennej, aby jej brakowało, O ile nie zostanie odczytane w nowym rekordzie. Dziękujemy – Elvis

+0

http://support.sas.com/documentation/cdl/en/lrcon/65287/HTML/default/viewer.htm#p08a4x7h9mkwqvn16jg3xqwfxful.htm – NEOmen

+0

(Usunięto komentarze dotyczące poprzedniej wersji odpowiedzi). – Joe

1

SAS ustawia flagę dla każdej zmiennej w PDV, która określa co się z nim stanie, kiedy krok danych powraca na początek pętli. Ta flaga wskazuje, że albo zmienna zostanie zresetowana do zaniku, albo nie zostanie zresetowana do zaniku (i zachowa aktualną wartość).

Domyślnie ta flaga wskazuje, że zmienna powinna zostać zresetowana. Ta flaga zwykle jest ustawiona na "zachowaj wartość" na jeden z dwóch sposobów.

  • Po pierwsze, jeśli zmienna jest obecna w oświadczeniu zachować lub ma operatora SUM używany z nim po lewej stronie (x+1;), flaga jest ustawiona dla tej zmiennej.
  • Po drugie, jeśli zmienna jest obecna w set, merge, "modyfikuj" lub update, flaga jest ustawiona dla tej zmiennej.

W tym przypadku zmienna z jest obecna w instrukcji set, więc jest automatycznie zachowywana.

Oto kolejny dobry przykład tego działania.

data test1; 
do x=1 to 5; 
    y=2; 
    output; 
end; 
run; 

data test2; 
    do x=6 to 10; 
    output; 
    end; 
run; 

data test3; 
    set test1 test2; 
    if x=7 then y=4; 
run; 

Tutaj y będzie ustawiony brakuje po ostatnim zapisem test1 jest odczytywany; Dzieje się tak, ponieważ na końcu grupy lub zestawu danych ustawia wszystkie zmienne na brakujące raz. Jednak y jest nadal automatycznie zachowywany; ta flaga nie jest czymś, co można zmienić. Więc kiedy ustawię y=4; na zapisie x=7, to 4 zostanie zachowane do końca. Tak więc x=6 ma brakujące domieć.

Ale zaczekaj, mówisz.Moje zmienne x i y są również obecne na oświadczeniu set i nie są automatycznie zachowywane. Są one ponownie ustawiane za każdym razem, gdy krok danych jest odczytywany z zestawu danych.

Nie. Są ustawione na nową wartość, tak: ale nigdy nie zostaną utracone. Ma to szczególne znaczenie w kilku przypadkach: wiele do jednego łączy, które zasadniczo działają tak, jak powyżej, ale z grupami by: rekord one jest scalony ze wszystkimi many, nie dlatego, że jest odczytywany wielokrotnie, ale dlatego, że jest raz odczytywać , a następnie nie zmieniać ponownie na brakujący (tj. jest zachowywany). To dlatego wiele do jednego seryjnej jest nieco niebezpieczne, jeśli nie jesteś tego świadomy:

data test1; 
    do x=1 to 5; 
    z=0; 
    output; 
    end; 
run; 

data test2; 
    do x=1 to 5; 
    do y=1 to 3; 
     output; 
    end; 
    end; 
run; 

data testMerge; 
    merge test1 test2; 
    by x; 
    if y=2 then z=1; 
run; 

Uwaga, z=1 jest prawdziwe dla y=2i dla y=3 zapisów, mimo że nie poprosić o że! Ups! To dlatego, że z został odczytywany od test1 raz na pierwszy z każdego x według rekordu grupy, a następnie nie ponownie przeczytać po tym - po prostu zachowany.

Powiązane problemy