 Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# Re: st: reverse lookup

 From Jeph Herrin To statalist@hsphsun2.harvard.edu Subject Re: st: reverse lookup Date Tue, 08 Jan 2013 16:33:34 -0500

Yes, the Mata construct is the ideal. And obviously, one must have 1-1 mapping; this I usually check by:
```
sum rate if period==1
local rate=cond(`r(min)'==`r(max)',r(min),.)

```
I was thinking of writing some programs to do lookups like this, since I have been doing so many, and thought I'd ask first for an alternative.
```
thanks,
Jeph

On 1/8/2013 2:27 PM, Nick Cox wrote:
```
```My short answer is that yes, this is awkward, but you are working with
the most obvious way to do it in Stata. The problem is that in general

... if <condition>

is not guaranteed to identify precisely one observation. It might
yield one, or zero or more than one.

In your case you need == in your code and can use

su rate if period == 1, meanonly
local value = r(min)

The misnamed -meanonly- is quieter and more efficient. If the
condition identifies precisely one observation, then clearly r(min),
r(mean), r(max) will be identical.

The problem is discussed from a different angle in

SJ-6-4  dm0025  . . . . . . . . . .  Stata tip 36: Which observations? Erratum
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
Q4/06   SJ 6(4):596                              (no commands)
correction of example code for Stata tip 36

SJ-6-3  dm0025  . . . . . . . . . . . . . .  Stata tip 36: Which observations?
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
Q3/06   SJ 6(3):430--432                                 (no commands)
tip for identifying which observations satisfy some
specified condition

Mata is not surprisingly less awkward here:

: y = 1::10

: x = runiform(10,1)

: x , y
1             2
+-----------------------------+
1 |  .5044846558             1  |
2 |  .0174561641             2  |
3 |   .680281796             3  |
4 |  .9221656218             4  |
5 |  .1094441491             5  |
6 |  .7122591983             6  |
7 |   .765775156             7  |
8 |  .0226029507             8  |
9 |  .9540165765             9  |
10 |  .2686450339            10  |
+-----------------------------+

: select(x, y :== 1)
.5044846558

Nick

On Tue, Jan 8, 2013 at 7:07 PM, Jeph Herrin <stata@spandrel.net> wrote:

```
```I've just written the same awkward code for the untoldth time, and I'm
thinking there must be a better way to do it.

The problem is to get a particular value of a variable into a local which
corresponds to a particular value of another variable. I think this is
usally call reverse lookup. For example, I might have -period- and -rate-
and want to store the value of -rate- which corresponds to period = 1. My
lazy solution is

sum rate if period = 1
local rate1 `=r(mean)'

That is, I summarize a single observation, then put the mean in local. Is
there a better way to do this?
```
```*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/

```
```*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/
```