Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: st: Converting a SAS datastep to Stata
From 
 
Nick Cox <[email protected]> 
To 
 
"'[email protected]'" <[email protected]> 
Subject 
 
RE: st: Converting a SAS datastep to Stata 
Date 
 
Wed, 15 Dec 2010 12:12:25 +0000 
If I understand that SAS code correctly, and I've never used SAS in my life, an equivalent would be 
gen lvalue1 = expr1 if flpdyr > 1993 & flpdyr < 1998
gen lvalue2 = expr2 if flpdyr > 1993 & flpdyr < 1998
In fact 
if flpdyr > 1993 & flpdyr < 1998
could be translated to 
if inrange(flpdyr, 1994, 1997)
which isn't much shorter but is likely to match the way you think more closely. (Here I am taking it from context that year variables take integer values only.) 
There are problems on various levels with your code. 
1. There is no comma before -if-. Such commas precede options, and -if- is not an option. 
2. The creation of an extra variable -sample- does no great harm but is not needed. 
3. Your -generate sample = 1 if ...- would generate a variable that could be 1 or missing. Any subsequent -if sample- would select both the 1s and the missings as missings are non-zero in Stata. 
For more on the last point, see
FAQ     . . . . . . . . . . . . . . . . . . . . . . .  True and false in Stata
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
        2/03    What is true and false in Stata?
                http://www.stata.com/support/faqs/data/trueorfalse.html
In essence, yes: an -if- qualifier applying, or not applying, observation by observation must be repeated on every command to which it applies. 
Whatever SAS code has been waved in front of me over the years has not given me the impression that it is a much more concise and elegant language! 
Nick 
[email protected] 
Daniel Feenberg
[...] 
Even in Stata, I am worried a bit about translating block if statements. 
The SAS block:
    if flpdyr > 1993 & flpdyr < 1998 then do;
        lvalue1 = expr1;
        lvalue2 = expr2;
     end;
could  be translated to:
    gen sample = 1, if flpdyr >1993 & flpdyr < 1998
    gen lvalue1 = expr1, if sample
    gen lvalue2 = expr2, if sample
but that requires redundant and repetive code. There are many blocks and 
some are 50 to 100 lines long. I am still surprised there isn't any syntax 
to apply the "if qualifier" to a block of code, and the ability to nest 
such blocks. Or am I missing something again?
[...] 
*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/