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: reverse lookup
From
Nick Cox <[email protected]>
To
[email protected]
Subject
Re: st: reverse lookup
Date
Wed, 9 Jan 2013 17:40:59 +0000
That way lies -levelsof-.
Nick
On Wed, Jan 9, 2013 at 2:54 PM, Jeph Herrin <[email protected]> wrote:
> Yes, the sort works as well for strings.
>
> I'm thinking of a program will return the list of matches, along with a flag
> regarding uniqueness, because in some contexts it's good have the set of
> matching values. But no need to post it here (grin).
>
> cheers,
> Jeph
>
>
> On 1/8/2013 10:19 PM, Nick Cox wrote:
>>
>> The approach in my earlier code could be extended.
>>
>> program vallookup, sort
>> version 8.2
>> syntax varname [if] [in] [, local(str) scalar(str) ]
>>
>> marksample touse, strok
>> qui count if `touse'
>> local nuse = r(N)
>> if `nuse' == 0 error 2000
>>
>> capture confirm numeric variable `varlist'
>>
>> if _rc == 0 {
>> su `varlist' if `touse', meanonly
>> if r(min) != r(max) {
>> di as err "specification not satisfied by single
>> value"
>> exit 498
>> }
>>
>> di r(min)
>> if "`local'" != "" {
>> c_local `local' = r(min)
>> }
>> if "`scalar'" != "" {
>> scalar `scalar' = r(min)
>> }
>> }
>> else {
>> sort `touse' `varlist'
>> if `varlist'[_N - `nuse' + 1] != `varlist'[_N] {
>> di as err "specification not satisfied by single
>> value"
>> exit 498
>> }
>>
>> di `varlist'[_N]
>> if "`local'" != "" {
>> c_local `local' = `varlist'[_N]
>> }
>> if "`scalar'" != "" {
>> scalar `scalar' = `varlist'[_N]
>> }
>> }
>> end
>>
>>
>> On Tue, Jan 8, 2013 at 10:58 PM, Jeph Herrin <[email protected]> wrote:
>>>
>>> String variables are a problem all their own. I usually do something
>>> like:
>>>
>>> encode strvar, gen(strvar_coded)
>>> sum strvar_coded if period==1
>>> local rate1= ///
>>> cond(`r(min)'==`r(max)',`=: label (strvar_coded) `=r(min)'',"")
>>>
>>> which however can run into trouble if there are too many values to
>>> -strvar-.
>>>
>>>
>>>
>>> On 1/8/2013 4:48 PM, Nick Cox wrote:
>>>>
>>>>
>>>> Here's a sketch. (Also, what about string variables?)
>>>>
>>>> program vallookup
>>>> version 8.2
>>>> syntax varname(numeric) [if] [in] [, local(str) scalar(str) ]
>>>>
>>>> marksample touse, strok
>>>> qui count if `touse'
>>>> if r(N) == 0 error 2000
>>>>
>>>> capture confirm numeric variable `varlist'
>>>>
>>>> su `varlist' if `touse', meanonly
>>>> if r(min) != r(max) {
>>>> di as err "specification not satisfied by single value"
>>>> exit 498
>>>> }
>>>>
>>>> di r(min)
>>>> if "`local'" != "" {
>>>> c_local `local' = r(min)
>>>> }
>>>> if "`scalar'" != "" {
>>>> scalar `scalar' = r(min)
>>>> }
>>>> end
>>>>
>>>> On Tue, Jan 8, 2013 at 9:33 PM, Jeph Herrin <[email protected]> wrote:
>>>>>
>>>>>
>>>>> 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 <[email protected]>
>>>>>> 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/