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: editing string variables to remove letters and keep only numbers
From
Nick Cox <[email protected]>
To
"[email protected]" <[email protected]>
Subject
Re: st: editing string variables to remove letters and keep only numbers
Date
Tue, 18 Jun 2013 18:40:39 +0100
The local macro -lmax- is not defined the second way.
That's what "local" means. Local macros defined in one place won't be
visible in another.
Nick
[email protected]
On 18 June 2013 18:34, Michael McCulloch <[email protected]> wrote:
> Thanks Nick and Rich,
> These comments helped me get started on understanding forval.
>
> And in Nick's interpretive instructions, I discovered my error:
>
> If I run this entire section of code in one do-file command, it is successful:
> gen length = length(id)
> su length, meanonly
> local lmax = r(max)
> gen numstr = ""
> gen letterstr = ""
> forval i = 1/`lmax'{
> replace numstr = numstr + substr(id,`i',1) if inrange(real(substr(id,`i',1)),0,9)
> replace letterstr = letterstr + substr(id,`i',1) if !inrange(real(substr(id,`i',1)),0,9)
> }
>
> However, when i was running the first 5 lines and then the forval separately, the syntax error message occurred.
> Why is that?
>
> Best wishes,
> Michael McCulloch, LAc MPH PhD
>
> --
> Pine Street Foundation, since 1989
> 124 Pine Street | San Anselmo | California | 94960-2674
> P: (415) 407-1357 | F: (206) 338-2391 | http://www.PineStreetFoundation.org
>
> On Jun 18, 2013, at 10:20 AM, Nick Cox wrote:
>
>> Rich is right. The example code was meant to show how simple the idea
>> was; it seems that was a failure.
>>
>> Starting again, and correcting a typo of mine.
>>
>> #1 What's the length of the longest string?
>>
>> #1.1 What is the length of each string value?
>> gen length = length(strvar)
>>
>> #1.2 Summarize that
>> su length, meanonly
>>
>> #1.3 Put the maximum in a local macro
>> local lmax = r(max)
>>
>> #2 Initialise variables to hold numeric and non-numeric characters:
>> gen numstr = ""
>> gen letterstr = ""
>>
>>
>> #3 loop over characters from first to last
>> forval i = 1/`lmax' {
>>
>> #3.1 one command line only
>> # if i th character is between 0 and 9, it's a numeric character, so
>> add it to numeric character variable
>>
>> replace numstr = numstr + substr(strvar, `i', 1) if
>> inrange(real(substr(strvar, `i', 1)), 0, 9)
>>
>> #3.2 one command line only
>> #otherwise add it to non-numeric character variable
>>
>> replace letterstr = letterstr + substr(strvar, `i', 1) if
>> !inrange(real(substr(strvar, `i', 1)), 0, 9)
>>
>> }
>>
>> Nick
>> [email protected]
>>
>>
>> On 18 June 2013 17:03, Richard Goldstein <[email protected]> wrote:
>>
>>> looks to me like you are putting what should be on one line onto two
>>> lines without the "///" continuation; note that in the code below, the
>>> loop should only have two lines, each starting with "replace"
>>
>> On 6/18/13 12:00 PM, Michael McCulloch wrote:
>>
>>>> Nick, as it's NOW written (with your correction included), I still receive an "invalid syntax" error.
>>>> This is my first exercise in learning -forval-, so even after reviewing the -help- I'm not sure how to troubleshoot further.
>>>>
>>>> forval i = 1/`lmax' {
>>>> replace numstr = numstr + substr(id, `i', 1) if
>>>> inrange(real(substr(id, `i', 1)), 0, 9)
>>>> replace letterstr = letterstr + substr(id, `i', 1) if
>>>> !inrange(real(substr(id, `i', 1)), 0, 9)
>>>> }
>>>>
>> *
>> * 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/
*
* 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/