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]

From |
Nick Cox <njcoxstata@gmail.com> |

To |
statalist@hsphsun2.harvard.edu |

Subject |
Re: st: Looping over variables |

Date |
Wed, 19 Dec 2012 12:46:05 +0000 |

Your results are correct. The problem was mine; precedence rules mean that the code should have been replace n_preg = n_preg + (inlist(aa`j', 1, 5) | (inlist(aa`j', 2, 3, 4, 6, 7) & inrange(aa`J', 13, .))) to ensure that the entire logical condition is evaluated separately. Sorry about that. Nick On Wed, Dec 19, 2012 at 12:30 PM, Ingeborg Forthun <ingeborg.forthun@gmail.com> wrote: > I am sorry if I have misunderstood, but the two codes do not give the > same result. > > The first code: > gen n_preg = 0 > forval j = 95(6)149 { > local J = `j' + 1 > replace n_preg = n_preg + inlist(aa`j', 1, 5) | (inlist(aa`j', 2, 3, > 4, 6, 7) & inrange(aa`J', 13, .)) > } > > returns: > > n_preg | Freq. Percent Cum. > ------------+----------------------------------- > 0 | 46,703 45.91 45.91 > 1 | 55,024 54.09 100.00 > ------------+----------------------------------- > Total | 101,727 100.00 > > > The second code: > gen n_preg = 0 > forval j = 95(6)149 { > local J = `j' + 1 > replace n_preg = n_preg + 1 if inlist(aa`j', 1, 5) | > (inlist(aa`j', 2, 3, > 4, 6, 7) & inrange(aa`J', 13, .)) > } > > returns: > > n_preg | Freq. Percent Cum. > ------------+----------------------------------- > 0 | 46,703 45.91 45.91 > 1 | 35,664 35.06 80.97 > 2 | 15,164 14.91 95.88 > 3 | 3,303 3.25 99.12 > 4 | 682 0.67 99.79 > 5 | 143 0.14 99.93 > 6 | 35 0.03 99.97 > 7 | 19 0.02 99.99 > 8 | 7 0.01 99.99 > 9 | 4 0.00 100.00 > 10 | 3 0.00 100.00 > ------------+----------------------------------- > Total | 101,727 100.00 > > > This is what I need to know. I have to know the exact number of > pregnancies and not only 0 or 1. > > Ingeborg > > 2012/12/19 Nick Cox <njcoxstata@gmail.com>: >> This is likely to be confusing to others. >> >> As you say, you want to count the number of pregnancies and my code, >> along the lines suggested by Daniel, does that. It does that because >> the logical condition evaluates to 1 or 0, which gives you the right >> answer. >> >> In a simpler example if you are counting instances of 42 or 43 then >> >> inlist(42, 42, 43) >> >> returns 1 and >> >> inlist (24, 42, 43) >> >> returns 0 -- so in a loop you can use that result directly. You could >> say something like >> >> replace n42_43 = n42_43 + inlist(<whatever>, 42, 43) >> >> You don't have to say >> >> replace n42_43 = n42_43 + 1 if inlist(<whatever>, 42, 43) >> >> If you want to write it your way, that's fine, but there is no sense >> in which you _have_ to do that. >> >> Nick >> >> On Wed, Dec 19, 2012 at 9:56 AM, Ingeborg Forthun >> <ingeborg.forthun@gmail.com> wrote: >>> Thank you very much for your advice! It works! But as I want to count >>> the number of pregnancies for each observation (forgot to write this >>> in my first e-mail!) I had to add +1 in the third line in order for it >>> to add 1 for each pregnancy. >>> >>> gen n_preg = 0 >>> >>> . forval j = 95(6)149 { >>> 2. local J = `j' + 1 >>> 3. replace n_preg = n_preg + 1 if inlist(aa`j', 1, 5) | >>> (inlist(aa`j', 2, 3, 4, 6, 7) & inrange(aa`J', 13, .)) >>> 4. } >>> >>> >>> Ingeborg >>> >>> >>> 2012/12/18 Nick Cox <njcoxstata@gmail.com> >>>> >>>> I agree with Daniel's main advice. You can simplify this (e.g.) >>>> >>>> gen n_preg = 0 >>>> forval j = 95(6)149 { >>>> local J = `j' + 1 >>>> replace n_preg = n_preg + inlist(aa`j', 1, 5) | (inlist(aa`j', 2, 3, >>>> 4, 6, 7) & inrange(aa`J', 13, .)) >>>> } >>>> >>>> See also for specific and general advice: >>>> >>>> [D] functions . . . . . . . . . . . . . . . inlist() programming function >>>> (help inlist()) >>>> >>>> [D] functions . . . . . . . . . . . . . . . inrange() programming function >>>> (help inrange()) >>>> >>>> SJ-9-1 pr0046 . . . . . . . . . . . . . . . . . . . Speaking Stata: Rowwise >>>> (help rowsort, rowranks if installed) . . . . . . . . . . . N. J. Cox >>>> Q1/09 SJ 9(1):137--157 >>>> shows how to exploit functions, egen functions, and Mata >>>> for working rowwise; rowsort and rowranks are introduced >>>> >>>> SJ-6-4 dm0026 . . . . . . Stata tip 39: In a list or out? In a range or out? >>>> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . N. J. Cox >>>> Q4/06 SJ 6(4):593--595 (no commands) >>>> tip for use of inlist() and inrange() >>>> >>>> It seems also that the names of your variables bear little relation to >>>> their contents. Systematic use of -rename- is likely to make further >>>> analysis much easier (and less error-prone). >>>> >>>> Finally, for "STATA" read "Stata", and please read the Statalist FAQ >>>> to see why. >>>> >>>> Nick >>>> >>>> On Tue, Dec 18, 2012 at 8:47 AM, daniel klein <klein.daniel.81@gmail.com> wrote: >>>> >>>> > You could probably create a loop over the values 95, 101 and so on, >>>> > and add 1 to the respective number inside the loop to get at the >>>> > durration. But I would look at -egen-'s -anycount()- function first. >>>> > This might be a good way of approching this. >>>> >>>> Ingeborg Forthun >>>> >>>> > [...] >>>> > I want to make a variable that counts the number of pregnancies for each >>>> > woman if outcome is 1 or 5 or if outcome is 2,3,4,6 or 7 and number of >>>> > weeks of pregnancy was more than 12 weeks. Number of weeks of >>>> > pregnancy is given by aa96 (corresponding to the outcome of the first >>>> > pregnancy given by aa95), aa102 (corresponding to the outcome of the >>>> > second pregnancy given by aa101), and so on. * * 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/

**Follow-Ups**:**Re: st: Looping over variables***From:*Ingeborg Forthun <ingeborg.forthun@gmail.com>

**References**:**Re: st: Looping over variables***From:*daniel klein <klein.daniel.81@gmail.com>

**Re: st: Looping over variables***From:*Nick Cox <njcoxstata@gmail.com>

**Re: st: Looping over variables***From:*Ingeborg Forthun <ingeborg.forthun@gmail.com>

**Re: st: Looping over variables***From:*Nick Cox <njcoxstata@gmail.com>

**Re: st: Looping over variables***From:*Ingeborg Forthun <ingeborg.forthun@gmail.com>

- Prev by Date:
**Re: st: Looping over variables** - Next by Date:
**Re: st: Reorder variables in dataset, based on its values** - Previous by thread:
**Re: st: Looping over variables** - Next by thread:
**Re: st: Looping over variables** - Index(es):