Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down at the end of May, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: renaming variables from first observation


From   Nick Cox <njcoxstata@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: renaming variables from first observation
Date   Thu, 25 Aug 2011 11:21:24 +0100

Fine, but let me underline that `=exp' is relevant in my postings
earlier in this thread only for those loops using it.

It is usually wrong for the -renvars- solution I gave first.

To spell this out:

renvars, map(`=word("@", 1)')

is seen by -renvars- as

renvars, map(@)

as the expression -word("@", 1)- is evaluated on the fly and the first
word of "@" is just the same string. But that was not what was
intended at all. It is the result of another Stata principle that
references to varname -- in this case inside -renvars- --  are
interpreted as references to varname[1] whenever only a single value
can be returned and that will work so long as all such values of each
variable in question are legal names. But they aren't in your example.

On Thu, Aug 25, 2011 at 11:12 AM, Abhimanyu Arora
<abhimanyu.arora1987@gmail.com> wrote:
> Thanks a lot indeed Nick for the elegant solution and clear
> explanation of `=exp'. Potentially today's most useful thing learned.
> And thanks to Matthew, too for the handy option.
> Cheers
> Abhimanyu
>
>
> On Thu, Aug 25, 2011 at 12:04 PM, Nick Cox <njcoxstata@gmail.com> wrote:
>> Yes indeed.
>>
>> -strtoname()- arrived in Stata long after even the last update of
>> -renvars-, but that doesn't rule out anything.
>>
>> renvars, map(strtoname(@[1]))
>>
>> would I guess be the recipe to try, or
>>
>> forval j = 1/14  {
>>     rename var`j' `=strtoname(var`j'[1])'
>> }
>>
>> Nick
>>
>> On Thu, Aug 25, 2011 at 10:57 AM, Matthew White
>> <mwhite@poverty-action.org> wrote:
>>
>>> It'd create longer variable names, but maybe -strtoname()- is another option?
>>
>> On Thu, Aug 25, 2011 at 9:27 AM, Nick Cox <njcoxstata@gmail.com> wrote:
>>
>>>> In fact, much of the last part of this to with -renvars- is a red
>>>> herring. I was wondering exactly why my code with -renvars- worked; I
>>>> just figured out that it was an accident in the original example in
>>>> which buggy code gave the right answer for the wrong reason.
>>>>
>>>> Better code is
>>>>
>>>> renvars , map(word(@[1], 1))
>>>>
>>>> This should be more transparent. The idiosyncratic detail is that @ is
>>>> a placeholder for each variable name in turn. The recipe then is to
>>>> use the first word of the value in the first observation. So for
>>>> -var1- the new name would be the value of
>>>>
>>>> word(var1[1], 1)
>>>>
>>>> Nick
>>>>
>>>> On Thu, Aug 25, 2011 at 10:13 AM, Nick Cox <njcoxstata@gmail.com> wrote:
>>>>> Let's assume that your first values are all legal names. You could
>>>>> indeed do this
>>>>>
>>>>> forval j  = 1/14 {
>>>>>      local names `names' `=var`j'[1]'
>>>>> }
>>>>> renvars var1-var14 \ `names'
>>>>>
>>>>> But that's actually dozens of lines more code (look _inside_ -renvars-)  than
>>>>>
>>>>> forval j = 1/14 {
>>>>>     rename var`j' `=var`j'[1]'
>>>>> }
>>>>>
>>>>> and the second is in any case shorter and more direct, even without
>>>>> looking inside -renvars-.
>>>>>
>>>>> You asked what a solution was with -renvars- and I agree that it looks
>>>>> complicated. The -map()- option was mine and intended as an outlet for
>>>>> the desperate user-programmer whose problem was not met by any of the
>>>>> other options. But usually you need to be moderately fluent in Stata
>>>>> to make effective use of it. The program was written for the authors'
>>>>> use and any utility beyond that is a pleasant side-effect!
>>>>>
>>>>> `= exp'
>>>>>
>>>>> evaluates an expression on the fly and is documented tersely at -help
>>>>> macro-. But the main idea is simple. Consider as part of a command
>>>>> line
>>>>>
>>>>> `= 2 + 2'
>>>>>
>>>>> Stata sees ` ' and so expects something like a macro reference to be
>>>>> substituted. But instead of a macro name there is
>>>>>
>>>>> = 2 + 2
>>>>>
>>>>> Stata does the calculation on the fly. In this case the result is 4
>>>>> and that is what the command would see.
>>>>>
>>>>> -renvars- is over a decade old now. After that length of time
>>>>> StataCorp caught up and the official -rename- is now much versatile in
>>>>> Stata 12, although I doubt it has a way to solve your problem without
>>>>> a loop. I would be happy to be shown wrong on that.
>>>>>
>>>>> Nick
>>>>>
>>>>>
>>>>> On Thu, Aug 25, 2011 at 9:50 AM, Abhimanyu Arora
>>>>> <abhimanyu.arora1987@gmail.com> wrote:
>>>>>> Yes Nick, precisely, my values in the first observation were not
>>>>>> legal. What I meant by storing values in a macro was something like a
>>>>>> horizontal -levelsof- command. Once I obtain the values in a single
>>>>>> macro I thought of simply using your and Jeroen Weesie's -renvars-.
>>>>>>
>>>>>> But the map option seems not that easy to understand, perhaps because
>>>>>> I find `quotes' confusing sometimes. One needs to have a string
>>>>>> expression in the parentheses while using the map option but I see
>>>>>> that the expression in your example is in `quotes', normally used for
>>>>>> macros. Would be really great if you could clarify this fundamental
>>>>>> issue.
>>>>>>
>>>>>> Many thanks
>>>>>> Abhimanyu
>>>>>>
>>>>>>
>>>>>> . list in 1
>>>>>>
>>>>>>     +--------------------------------------------------------------------------------------------------------------------+
>>>>>>  1. |        var1 |        var2 |         var3 |         var4 | var5
>>>>>> | var6 | var7 | var8 | var9 | var10 | var11 | var12 |
>>>>>>     | Series Code | Series Name | Country Code | Country Name | 2000
>>>>>> | 2001 | 2002 | 2003 | 2004 |  2005 |  2006 |  2007 |
>>>>>>     |---------------------------------------------------------+----------------------------------------------------------|
>>>>>>     |                          var13                          |
>>>>>>                   var14                           |
>>>>>>     |                           2008                          |
>>>>>>                    2009                           |
>>>>>>     +--------------------------------------------------------------------------------------------------------------------+
>>>>>>
>>>>>> On Thu, Aug 25, 2011 at 10:35 AM, Nick Cox <njcoxstata@gmail.com> wrote:
>>>>>>> Already answered, but not correctly. You could e.g. use the first word
>>>>>>> of the first value. This works:
>>>>>>>
>>>>>>> . l
>>>>>>>
>>>>>>>     +------------------------------+
>>>>>>>     | var1   var2             var3 |
>>>>>>>     |------------------------------|
>>>>>>>  1. | Frog   Toad   Venomous snake |
>>>>>>>  2. |    1      2                3 |
>>>>>>>     +------------------------------+
>>>>>>>
>>>>>>> . renvars , map(`=word("@", 1)')
>>>>>>>
>>>>>>> . l
>>>>>>>
>>>>>>>     +------------------------------+
>>>>>>>     | Frog   Toad         Venomous |
>>>>>>>     |------------------------------|
>>>>>>>  1. | Frog   Toad   Venomous snake |
>>>>>>>  2. |    1      2                3 |
>>>>>>>     +------------------------------+
>>>>>>>
>>>>>>> Nick
>>>>>>>
>>>>>>> On Thu, Aug 25, 2011 at 9:25 AM, Abhimanyu Arora
>>>>>>> <abhimanyu.arora1987@gmail.com> wrote:
>>>>>>>> I caught the mistake, thanks to -set trace on-. 'Code' is the second
>>>>>>>> word of my observation of the first variable and of course a variable
>>>>>>>> name has to be single worded. But my question on possibility of using
>>>>>>>> Nick's -renvars- remains.
>>>>>>>> Best regards
>>>>>>>> Abhimanyu
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thu, Aug 25, 2011 at 10:07 AM, Abhimanyu Arora
>>>>>>>> <abhimanyu.arora1987@gmail.com> wrote:
>>>>>>>>> Good morning statalist
>>>>>>>>> I would like to rename my variables var1-var14 to the corresponding
>>>>>>>>> values from the first observation.
>>>>>>>>> I followed the post on
>>>>>>>>> http://www.stata.com/statalist/archive/2004-07/msg00009.html and
>>>>>>>>> modified it for my purpose.
>>>>>>>>>
>>>>>>>>> but I got this error
>>>>>>>>>
>>>>>>>>> . forvalues k = 1/14  {
>>>>>>>>>  2.   local newname  = var`k'[1]
>>>>>>>>>  3.   ren var`k'  `newname'
>>>>>>>>>  4. }
>>>>>>>>>
>>>>>>>>> Code not allowed
>>>>>>>>>
>>>>>>>>> Also is it posible to store the values of an observation in a macro?
>>>>>>>>> Perhaps I could then use Nick Cox's -renvars-?

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


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index