I think you were perfectly clear,
but this question appears the same
to me, and so the answer is the same.
You can go in Stata
if x == 10 {
gen y = 12
gen q = 78
}
and this is legal, but it is not what
you want, I think. This code is to Stata
if x[1] == 10 {
gen y = 12 in 1/l
gen q = 78 in 1/l
}
which is rarely what anybody wants.
Fortran is no different here from Stata
(unless in this respect it has changed since
I learnt it 30 years ago), as the apparent
equivalent
IF (X.EQ.10) THEN
Y = 12
Q = 78
ENDIF
(.EQ. <--> ==)
applies to single values stored
in X, Y, Q, not to one-dimensional
arrays (Fortran's equivalent of
Stata's variables) -- unless
there are dialects of Fortran
in which you can do this to arrays.
I agree that one would occasionally
like to say something like
whenever x == 10 {
gen y = 12
gen q = 78
}
(thus leaving -y- and -q-
missing whenever x != 10),
the -whenever- being vectorised
in application, but Stata doesn't have this.
Also, there is considerable
repetition of work in
gen y = 12 if x == 10
gen q = 78 if x == 10
but that's the language as it is now.
I think your question is really for StataCorp
but they will (usually) maintain cryptic silence
on what language features may or may not be added
long-term.
To put it in a nutshell:
With -if { }- just one test is made. If
variables appear in the test, that makes
no difference. The test is applied to
the _first_ observation.
With ... if ... as many tests are made
as there are observations. (Sometimes
that's far more than you want, but
that's another story.)
Nick
[email protected]
Cameron Hooper
> Nick Cox wrote:
> > -if- as a keyword is overloaded. The
> > two ways of using -if- you exemplify
> > are not equivalent -- unless you have
> > single observation datasets.
>
> I have not been clear. I apologise. I completely agree that
> code should
> be readable.
>
> Let me explain. I am not looking for a way to exploit some
> unique aspect
> of my data to make my code more efficient. So for example,
>
> gen var1 = (fpi == "big") + 2 * (fpi == "small")
>
> works, but only for these particular values.
>
> I am asking a more general question. In stata can I test a
> condition and
> as a result of this single test generate (or replace) more than one
> variable? All of Nick's examples generated one variable as
> the result of
> testing one logical expression. In Fortran I can write:
>
> IF (X.GE.10) THEN
> Y = 12
> Q = 78
> ENDIF
>
> Test once, set two variables. The only way I know to do this
> in stata is
>
> gen y = 12 if x == 10
> gen q = 78 if x == 10
>
> I have to test x twice. Is there a way in stata to only test the
> condition once? I understand that "if exp {}" will not work.
>
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/