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: 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   Fri, 23 Nov 2012 12:14:18 -0500

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