# st: RE: if command

 From "Nick Cox" <[email protected]> To <[email protected]> Subject st: RE: if command Date Tue, 18 Jan 2005 17:01:48 -0000

```-if- as a keyword is overloaded. The
two ways of using -if- you exemplify
are not equivalent -- unless you have
single observation datasets. This is
explained in an FAQ at

http://www.stata.com/support/faqs/lang/ifqualifier.html

and elsewhere. I don't know about

if ... {

}

"not work[ing] as expected": that hinges
on weighting preconceptions from
some other languages more than
what is documented for Stata. There are many
languages that are like Stata in
this respect; or conversely, Stata
here imitates some of them.

You can collapse your examples in this way

gen var1 = (fpi == "big") + 2 * (fpi == "small")

or in this way

gen var1 = cond(fpi == "big", 1, cond(fpi == "small", 2, .))

or if "big" and "small" were the only possibilities

gen var1 = cond(fpi == "big", 1, 2)

Having said that, and voting for efficiency
rather than inefficiency any day, there's still
a lot to be said for code so transparent that
it is instantly comprehensible when you revisit.

Nested -cond()-s particularly divide the world.
It is no gain to bundle a mass of complicated
logic into a single statement with many -cond()-
examples if you make some subtle logic error.

Nick
[email protected]

Cameron Hooper

> What is the best way to achieve the following in stata? I have a
> reasonably complex logical test and number of new variables
> to generate
> as a result of applying the test. Here is a minimal example. The real
> problem is more complex, but this captures the spirit:
>
> gen var1 = 1 if fpi == "big"
> gen var2 = 1 if fpi == "big"
> replace var1 = 2 if fpi == "small"
> replace var2 == 12 if fpi =="small"
>
> Repeating the condition seems inefficient especially if it was very
> complex (it is) and if I have to create many new variables (I
> do). I was
> thinking some like this:
>
> if fpi == "big" {
> 	gen var1 = 1
> 	gen var2 = 1
> }
> if fpi == "small {
> 	replace var1 = 2
> 	replace var2 = 12
> }
>
> Not much of a saving in this example, but in a more complex
> problem the
> saving would, I think, be measurable. However, I know from
> experimentation and from a previous thread that this code
> does not work
> as expected. Is there a solution or should I should I just
> use the first
> coding style? Thanks in advance.
>
> Cameron
> *
> *   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/
>

*
*   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/
```