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