2015-07-13 13 views
5

Próbowałem tego kodu w SAS, ale dane wyjściowe nie są takie same, jak oczekuję.Ustaw w pierwszym wierszu, dlaczego mam dwa wiersze wyjściowe?

data temp; 
    input sumy; 
    datalines; 
36 
; 
run; 

data aaa; 
    if _n_ = 1 then 
     set temp; 
run; 

proc print data = aaa; 
run; 

Czy mogę zapytać, dlaczego istnieją dwie obserwacje, które dwukrotnie "ustawiły"? Jak działa "zestaw" i PDV tutaj podczas iteracji? Z góry dziękuję.

Odpowiedz

0

Gdy SAS tworzy nowy zestaw danych, odczytuje jeden rekord na raz, zapisując wartości z tego rekordu w wektorze danych programu (PDV), dopóki wartości z następnego rekordu nie zastąpią ich. SAS kontynuuje w ten sposób, dopóki nie osiągnie ostatniego rekordu.

Można odwołać się link do lepszego zrozumienia

http://www.lexjansen.com/nesug/nesug07/cc/cc45.pdf

Ponadto można przejść przez to odpowiedź na przepełnienie stosu

SAS . Are variables set to missing at every iteration of a data step?

+0

Nie sądzę, że to odpowiada na pytanie, a mianowicie, dlaczego istnieją 2 obserwacje w zbiorze danych wyjściowych. – Joe

2

Istnieją dwie obserwacje, ponieważ podczas drugiej DATA kroku iteracja nie wystąpiła operacja odczytu.

Instrukcja SET ma dwie role.

  1. Rola czasu kompilacji (bezwarunkowy) - nagłówek zestawu danych jest odczytywany przez kompilator, a do jego zmiennych dodawane są kroki PDV.
  2. Rola czasu pracy (warunkowa) - czytany jest wiersz z zestawu danych, a wartości są umieszczane w PDV za każdym razem, gdy kod osiągnie instrukcję SET.

Dodatkowo, każda zmienna przychodząca od (lub odpowiadająca) instrukcji SET ma jej wartość automatycznie zachowaną. Dlatego druga obserwacja stworzona przez twój przykładowy kod ma numer sumy=36.

Dodatkowe szczegóły z SAS support site:

Wykorzystanie Note 8914: krok DANE zatrzymany z powodu pętli wiadomość

Jeśli krokiem dane zapisywane są takie, że żadne stwierdzenia odczytu danych (np SET INPUT) są wykonywane, krok kończy się po jednej iteracji , a do dziennika SAS zapisywana jest następująca wiadomość:

UWAGA: DATA STEP zatrzymany z powodu zapętlenia.

+0

Nie jestem do końca pewien, co ten bit kompilacji ma do czynienia z tym pytaniem, i myślę, że możesz być bardziej precyzyjny z tym, co dokładnie się dzieje - ale ogólnie pojmujesz sedno problemu. – Joe

4

Ponieważ dwukrotnie wykonano domniemane WYJŚCIE na końcu etapu danych. Za pierwszym razem z _N_ = 1 czytasz jedną obserwację z wejściowego zestawu danych. Za drugim razem nie czytałeś nowej obserwacji, ponieważ _N_ teraz wynosi 2, a wartości z poprzedniej obserwacji zostały zachowane. Po drugiej obserwacji SAS zatrzymuje się, ponieważ wykrył, że twój krok danych jest w pętli.

Jeśli chcesz tylko jedną obserwację, dodaj instrukcję STOP przed instrukcją RUN lub przekoduj krok danych, aby użyć zestawu danych OBS = 1 w zestawie danych wejściowych, zamiast instrukcji IF.

Należy zauważyć, że jeśli zestaw danych wejściowych był pusty, to miałby wynik zero obserwacji, ponieważ krok danych zostałby zatrzymany, gdy instrukcja SET odczyta koniec końca wejściowego zestawu danych.

+0

Dziękuję. Czy to właściwe zrozumienie, że przy "jeśli _n_ = 1", krok danych MUSI BYĆ wprowadzić drugą iterację, a mianowicie _n_ = 2, prowadząc w ten sposób do dwóch obserwacji? Próbowałem również kod "if _n_ then set ...", usuwając "= 1". Okazuje się, że wyprowadza tylko jedną obserwację. dlaczego tak się dzieje/ – Darienzhang

+0

Ponieważ zestaw danych wejściowych miał tylko jedną obserwację. Jeśli nie masz wyraźnej instrukcji OUTPUT, to SAS zapisuje obserwację, gdy dojdzie do końca etapu danych. Zwykle powodem, dla którego SAS przestaje wykonywać krok danych jest to, że odczytał koniec pliku wejściowego. (Z instrukcją INPUT, SET, MERGE, UPDATE). Więc kiedy zmieniłeś swój IF, tak aby zawsze było prawdziwe, za drugim razem odczytał koniec zestawu danych wejściowych i zatrzymał się, zanim mógł wyprowadzić drugą obserwację. – Tom

+0

Dzięki stary, to naprawdę pomocne! – Darienzhang

Powiązane problemy