2014-05-18 22 views
5

Qual è la differenza tra IF e IF-THENIF-THEN vs IF in SAS

Ad esempio la dichiarazione

if type='H' then output; 

vs 

if type='H'; 
output; 
+0

La sezione Confronto della documentazione SAS su [Istruzione IF sussidiario] (http://support.sas.com/documentation/cdl/en/lestmtsref/67175/HTML/default/viewer.htm#p1cxl8ifdt8u0gn12wqbji8o5fq1.htm) fornisce dettagli su come la sottosezione "IF" si confronta con le dichiarazioni "IF-THEN" e "WHERE". – Amir

risposta

7

Un'istruzione if-then esegue in modo condizionale il codice. Se la condizione viene soddisfatta per una determinata osservazione, qualsiasi cosa segua la "allora" prima che venga eseguito lo ;, altrimenti non lo è. Nel tuo esempio, dal momento che quanto segue è output, solo le osservazioni con tipo 'H' vengono inviate al set di dati che viene creato dal passaggio di dati. Si può anche avere un'istruzione if-then-do, come nel codice seguente:

if type = 'H' then do; 
i=1; 
output; 
end; 

if-then-fanno dichiarazioni condizionale eseguire codice tra il do; e end;. Pertanto il codice sopra riportato è i=1; e output; solo se il tipo è uguale a 'H'.

Un if senza un then è un "subset se". Secondo SAS documentation:

Un subsetting IF verifica la condizione dopo un'osservazione è leggere in dati vettoriali programma (PDV). Se la condizione è vera, SAS continua a elaborare l'osservazione corrente. In caso contrario, l'osservazione viene scartata e l'elaborazione continua con la successiva osservazione .

Così, se la condizione di sottoinsiemi if (es. type='H') non è soddisfatta, l'osservazione non viene emesso al set di dati che vengono creati dalla fase dati. Nel tuo esempio, verranno visualizzate solo le osservazioni in cui il tipo è 'H'.

In sintesi, entrambi i codici di esempio producono lo stesso risultato, ma con diversi mezzi. if type='H' then output; emette solo osservazioni dove il tipo è 'H', mentre if type='H'; output; elimina le osservazioni quando il tipo non è 'H'.Notare che in quest'ultimo non è necessario lo output; perché è presente un output implicito nel passaggio dei dati SAS, che viene sovrascritto solo se esiste un comando esplicito output;.

+5

Questo è per lo più corretto. La sottomissione di 'if', tuttavia, non impedisce tecnicamente l'output; e fa molto di più che semplicemente impedire l'output nella maggior parte delle situazioni. Nello specifico, l'inserimento di 'if' termina l'iterazione corrente del ciclo di passo dei dati e ritorna all'inizio del passo dei dati; simile a 'if (...) then return'. Questo è importante perché tutto ciò che è dopo la subsetting 'if' che non è riuscito non viene eseguito in quella riga. La sottostringa 'if' impedisce l'uscita automatica (poiché impedirebbe l'output' non automatico 'sopra) ma non influenza le precedenti istruzioni 'output'. – Joe

3

Sono simili ma non identici seguente. In un passaggio di dati, if è un'istruzione subsetting e tutti i record che non soddisfano la condizione vengono eliminati. Dalla documentazione:

"Continua a elaborare solo le osservazioni che soddisfano la condizione dell'espressione specificata."

if then funziona più come l'istruzione if in altre lingue, esegue l'istruzione dopo la clausola then in modo condizionale. Un esempio un po 'artificiosa:

data baz; 
set foo; 
if type = 'H'; 
x = x + 1; 
run; 

data baz: 
set foo; 
if type='H' then x = x + 1; 
run; 

In entrambi gli esempi x viene incrementato di 1 se type = 'H', ma nel primo passo dati baz non conterrà osservazioni di tipo diverso da 'H'.

Al giorno d'oggi sembra che la maggior parte delle cose che una volta venivano eseguite da if vengano eseguite utilizzando where.