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 on April 23, and its replacement, statalist.org is already up and running.


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

Re: st: Macros in -listtab- header: syntax error


From   Friedrich Huebler <fhuebler@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Macros in -listtab- header: syntax error
Date   Wed, 28 Nov 2012 15:28:28 -0500

Roger,

The number of "a" and "b" variables in the data is unknown. With
-chardef- I would still need a loop to -confirm- the existence of each
variable to build up a string that could then be used with -chardef-.
However, -chardef- will be convenient in other situations. Thank you
for bringing this package to my attention.

Friedrich

On Sun, Nov 25, 2012 at 10:56 AM, Roger B. Newson
<r.newson@imperial.ac.uk> wrote:
> You might possibly have saved a few loops here by using the SSC package
> -chardef-, which is a mass-production version of -char define- for lists of
> variables, with -prefix()- and -suffix()- options.
>
>
> Best wishes
>
> Roger
>
> Roger B Newson BSc MSc DPhil
> Lecturer in Medical Statistics
> Respiratory Epidemiology and Public Health Group
> National Heart and Lung Institute
> Imperial College London
> Royal Brompton Campus
> Room 33, Emmanuel Kaye Building
> 1B Manresa Road
> London SW3 6LR
> UNITED KINGDOM
> Tel: +44 (0)20 7352 8121 ext 3381
> Fax: +44 (0)20 7351 8322
> Email: r.newson@imperial.ac.uk
> Web page: http://www.imperial.ac.uk/nhli/r.newson/
> Departmental Web page:
> http://www1.imperial.ac.uk/medicine/about/divisions/nhli/respiration/popgenetics/reph/
>
> Opinions expressed are those of the author, not of the institution.
>
> On 23/11/2012 17:14, Friedrich Huebler wrote:
>>
>> Roger,
>>
>> Thank you, this is perfect. The -headchar()- option solves my problem.
>> Below is my original example, modified to show automatic generation of
>> the table headers that identify levels and grades in the data.
>>
>> Many thanks for -listtab- and for the continued updates to this package.
>>
>> Friedrich
>>
>>
>> * Step 1: Test dataset
>> sysuse auto, clear
>> forval i = 1/3 {
>>    gen a`i' = mpg if trunk<13
>> }
>> forval i = 4/5 {
>>    gen b`i' = mpg if trunk>=13
>> }
>> collapse a1 - b5, by(foreign)
>> egen sum = rowtotal(a1 - b5)
>> format a1 - sum %5.1f
>>
>> * Step 2: Automatic creation of values for -headchar()- option
>> * Headers for "a" variables
>> local j = 1
>> forval i = 1/8 {
>>    capture confirm variable a`i'
>>    if !_rc {
>>      if `j' == 1 {
>>        char a`i'[levels] "Level A"
>>      }
>>      char a`i'[grades] "Grade `j'"
>>      local j = `j' + 1
>>    }
>> }
>> * Headers for "b" variables
>> local j = 1
>> forval i = 1/8 {
>>    capture confirm variable b`i'
>>    if !_rc {
>>      if `j' == 1 {
>>        char b`i'[levels] "Level B"
>>      }
>>      char b`i'[grades] "Grade `j'"
>>      local j = `j' + 1
>>    }
>> }
>> * Header for "sum" variable
>> char sum[levels] "Sum"
>>
>> * Step 3: -listtab- table (tab-delimited text file)
>> #delimit ;
>> listtab a1 - sum using "table.txt",
>>    headchar(levels grades)
>>    rstyle(tabdelim)
>>    replace
>> ;
>> #delimit cr
>>
>>
>> On Thu, Nov 22, 2012 at 4:52 PM, Roger B. Newson
>> <r.newson@imperial.ac.uk> wrote:
>>>
>>> What you are doing doesn't seem to produce a well-formed string argument
>>> for
>>> input to -file-.
>>>
>>> A better idea might be to use the -headchar()- option of -listtab-, after
>>> storing the header strings "Grade 1", "Grade 2" and "Grade 3" in a named
>>> variable characteristic for each of the variables to be output (eg
>>> -headchar(varname)- if we want each variable to have a characteristic
>>> with
>>> name -varname-). This will produce header row containing the specified
>>> characteristic values of the output variables, separated by the
>>> delimiter,
>>> which you have specified to be a tab. The -headchar()- and -footchar()-
>>> options were added in a recent -listtab- update on SSC.
>>>
>>> for instance, you might type
>>>
>>> char a1[varname] "Grade 1";
>>> char a2[varname] "Grade 2";
>>> char a3[varname] "Grade 3";
>>> listtab a1 a2 a3 using mytab.txt, rstyle(tabdelim) headchar(varname)
>>> replace;
>>>
>>> This should create a header row containing the headers "Grade 1", "Grade
>>> 2"
>>> and "Grade 3" for variables a1, a2 and a3, respectively. You can, of
>>> course,
>>> name multiple characheristics in -headchar()- to make multiple header
>>> rows.
>>>
>>>
>>> I hope this helps.
>>>
>>> Best wishes
>>>
>>> Roger
>>>
>>> Roger B Newson BSc MSc DPhil
>>> Lecturer in Medical Statistics
>>> Respiratory Epidemiology and Public Health Group
>>> National Heart and Lung Institute
>>> Imperial College London
>>> Royal Brompton Campus
>>> Room 33, Emmanuel Kaye Building
>>> 1B Manresa Road
>>> London SW3 6LR
>>> UNITED KINGDOM
>>> Tel: +44 (0)20 7352 8121 ext 3381
>>> Fax: +44 (0)20 7351 8322
>>> Email: r.newson@imperial.ac.uk
>>> Web page: http://www.imperial.ac.uk/nhli/r.newson/
>>> Departmental Web page:
>>>
>>> http://www1.imperial.ac.uk/medicine/about/divisions/nhli/respiration/popgenetics/reph/
>>>
>>> Opinions expressed are those of the author, not of the institution.
>>>
>>> On 22/11/2012 21:14, Friedrich Huebler wrote:
>>>>
>>>>
>>>> Roger,
>>>>
>>>> I see now that the line that you mentioned may be interpreted by Stata
>>>> as containing an unmatched ` character.
>>>>
>>>>     local bgrades "`bgrades'Grade `j'`""t""'"
>>>>
>>>> With this command I am trying to combine three separate elements
>>>> enclosed in double quotes. The first of those elements ends in a left
>>>> single quote (`):
>>>>
>>>>     "`bgrades'Grade `j'`" + "t" + "'"
>>>>
>>>> At the core the problem is that I am trying to create a macro with a
>>>> string that includes `t', text that should appear in the string as
>>>> such (a left single quote, then a lowercase t, then a right single
>>>> quote) instead of being interpreted as a macro. I thought I had
>>>> achieved this goal because the content of macro "agrades" is:
>>>>
>>>>     Grade 1`t'Grade 2`t'Grade 3`t'
>>>>
>>>> and the content of macro "bgrades" is:
>>>>
>>>>     Grade 1`t'Grade 2`t'
>>>>
>>>> The two macros combined appear as:
>>>>
>>>>     Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'
>>>>
>>>> The line above is exactly what I need in the -listtab- command and
>>>> there doesn't appear to be an unmatched ` character. For this reason I
>>>> am puzzled by the syntax error. As an alternative I tried the line
>>>> below, with the left single quote now enclosed in double quotes:
>>>>
>>>>     local bgrades "`bgrades'Grade `j'""`""t""'"
>>>>
>>>> The combined macros look correct:
>>>>
>>>> . di "`agrades'`bgrades'"
>>>> Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'
>>>>
>>>> However, -listtab- still stops with a syntax error.
>>>>
>>>>     = file write __00000B `"`"' _n
>>>> invalid syntax
>>>>
>>>> Friedrich
>>>>
>>>>
>>>> On Thu, Nov 22, 2012 at 2:19 PM, Roger B. Newson
>>>> <r.newson@imperial.ac.uk> wrote:
>>>>>
>>>>>
>>>>> Your quoted line
>>>>>
>>>>>
>>>>> file write __00000B `"Grade 1`"' _n
>>>>>
>>>>> appears (to me) to contain an unmatched ` character, immediately
>>>>> following
>>>>> the string "Grade 1". This may have originated from your line of code
>>>>> (in
>>>>> Step 3)
>>>>>
>>>>>
>>>>>        local bgrades "`bgrades'Grade `j'`""t""'"
>>>>>
>>>>> which seems to me to contain an unmatched ` character just after `j'
>>>>> and
>>>>> before "". I would expect this to cause some confusion somewhere,
>>>>> especially
>>>>> as your unmatched ` is just before a ", and the pair of characters
>>>>> looks
>>>>> like a left compound quote.
>>>>>
>>>>> I hope this helps.
>>>>>
>>>>> Best wishes
>>>>>
>>>>> Roger
>>>>>
>>>>> Roger B Newson BSc MSc DPhil
>>>>> Lecturer in Medical Statistics
>>>>> Respiratory Epidemiology and Public Health Group
>>>>> National Heart and Lung Institute
>>>>> Imperial College London
>>>>> Royal Brompton Campus
>>>>> Room 33, Emmanuel Kaye Building
>>>>> 1B Manresa Road
>>>>> London SW3 6LR
>>>>> UNITED KINGDOM
>>>>> Tel: +44 (0)20 7352 8121 ext 3381
>>>>> Fax: +44 (0)20 7351 8322
>>>>> Email: r.newson@imperial.ac.uk
>>>>> Web page: http://www.imperial.ac.uk/nhli/r.newson/
>>>>> Departmental Web page:
>>>>>
>>>>>
>>>>> http://www1.imperial.ac.uk/medicine/about/divisions/nhli/respiration/popgenetics/reph/
>>>>>
>>>>> Opinions expressed are those of the author, not of the institution.
>>>>>
>>>>>
>>>>> On 22/11/2012 17:26, Friedrich Huebler wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> I use Stata 11.2 with Windows 7 and would like to create a
>>>>>> tab-delimited text file similar to the one below.
>>>>>>
>>>>>> Level A                    Level B           Sum
>>>>>> Grade 1  Grade 2  Grade 3  Grade 1  Grade 2
>>>>>> 24.7     24.7     24.7     17.6     17.6     109.3
>>>>>> 26.2     26.2     26.2     23.4     23.4     125.5
>>>>>>
>>>>>> For this purpose I use the -listtab- Stata add-on by Roger Newson (see
>>>>>> -ssc d listtab-). The data is organized by level and grade, and the
>>>>>> number of grades per level varies. To automate the creation of the
>>>>>> table header I would like to use macros. When I include the macros in
>>>>>> the -listtab- command, Stata aborts with an "invalid syntax" error. I
>>>>>> don't know if this is due to the way I create the macros (e.g. the
>>>>>> combination of single and double quotes) or if this is a problem with
>>>>>> -listtab-.
>>>>>>
>>>>>> The problem can be demonstrated with the commands below. Step 1
>>>>>> creates a meaningless test dataset that mimics the structure of my
>>>>>> original data. Step 2 creates a tab-delimited text file in the desired
>>>>>> format; here, the table header is specified manually in the -listtab-
>>>>>> command. Step 3 is an attempt to automate the creation of the second
>>>>>> row in the table header; the number of grades per level is unknown but
>>>>>> is not greater than 8, hence the loop over the numbers 1 to 8. Step 4
>>>>>> is the -listtab- command that fails with a syntax error.
>>>>>>
>>>>>> Please note that the macros "agrades" and "bgrades", shown with the
>>>>>> -di- command at the end of Step 3, contain the same text as the table
>>>>>> header in Step 2:
>>>>>>
>>>>>> Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'
>>>>>>
>>>>>> -set trace on- reveals that the error occurs after the following line
>>>>>> but I don't know how to interpret this information:
>>>>>>
>>>>>>      = file write __00000B `"Grade 1`"' _n
>>>>>> invalid syntax
>>>>>> r(198);
>>>>>>
>>>>>> Thank you for your help,
>>>>>>
>>>>>> Friedrich
>>>>>>
>>>>>>
>>>>>> * Step 1: Test dataset
>>>>>> sysuse auto, clear
>>>>>> forval i = 1/3 {
>>>>>>      gen a`i' = mpg if trunk<13
>>>>>> }
>>>>>> forval i = 4/5 {
>>>>>>      gen b`i' = mpg if trunk>=13
>>>>>> }
>>>>>> collapse a1 - b5, by(foreign)
>>>>>> egen sum = rowtotal(a1 - b5)
>>>>>> format a1 - sum %5.1f
>>>>>>
>>>>>> * Step 2: -listtab- table without syntax error
>>>>>> * Tab character for -listtab- header
>>>>>> local t = char(9)
>>>>>> * Tab-delimited text file
>>>>>> #delimit ;
>>>>>> listtab a1 - sum using "table1.txt",
>>>>>>      head("Level A`t'`t'`t'Level B`t'`t'Sum"
>>>>>>           "Grade 1`t'Grade 2`t'Grade 3`t'Grade 1`t'Grade 2`t'")
>>>>>>      rstyle(tabdelim) replace
>>>>>> ;
>>>>>> #delimit cr
>>>>>>
>>>>>> * Step 3: Create entries for a and b variables in table header
>>>>>> * Entry for a variables
>>>>>> local agrades ""
>>>>>> local j = 1
>>>>>> forval i = 1/8 {
>>>>>>      capture confirm variable a`i'
>>>>>>      if !_rc {
>>>>>>        local agrades "`agrades'Grade `j'`""t""'"
>>>>>>        local j = `j' + 1
>>>>>>      }
>>>>>> }
>>>>>> * Entry for b variables
>>>>>> local bgrades ""
>>>>>> local j = 1
>>>>>> forval i = 1/8 {
>>>>>>      capture confirm variable b`i'
>>>>>>      if !_rc {
>>>>>>        local bgrades "`bgrades'Grade `j'`""t""'"
>>>>>>        local j = `j' + 1
>>>>>>      }
>>>>>> }
>>>>>> * Show macros with table header entries
>>>>>> di "`agrades'`bgrades'"
>>>>>>
>>>>>> * Step 4: -listtab- table with syntax error
>>>>>> * Tab character for -listtab- header
>>>>>> local t = char(9)
>>>>>> * Tab-delimited text file
>>>>>> #delimit ;
>>>>>> listtab a1 - sum using "table2.txt",
>>>>>>      head("Level A`t'`t'`t'Level B`t'`t'Sum"
>>>>>>           "`agrades'`bgrades'")
>>>>>>      rstyle(tabdelim) replace
>>>>>> ;
>>>>>> #delimit cr
*
*   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/


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