Bookmark and Share

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: RE: loop question


From   Nick Cox <[email protected]>
To   "'[email protected]'" <[email protected]>
Subject   RE: st: RE: loop question
Date   Tue, 30 Nov 2010 19:37:38 +0000

local stuff w1flsibage
gen count = 0 
qui forval j = 1/20 { 
	replace count = count + (`stuff'`j' > w1ageint & !missing(`stuff'`j')) 
} 

Here `stuff' is just a substitution to make the principle clearer. 

(`stuff'`j' > w1ageint & !missing(`stuff'`j'))

will be 1 whenever both conditions are satisfied and 0 otherwise. 

See e.g. 

FAQ     . . . . . . . . . . . . . . . . . . . . . . .  True and false in Stata
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
        2/03    What is true and false in Stata?
                http://www.stata.com/support/faqs/data/trueorfalse.html

if more detail is needed. Missings need care, as your original post showed. 

Nick 
[email protected] 

P C

Thanks for the reply.

Basically, I have twenty variables in the data set. They have the same suffix: 
w1flsibage. They all ended up with different numbers. The twenty variables 
go like this: w1flsibage1 w1flsibage2 .... w1flsibage20. These variables 
indicate sibling's age. 


Then I compare each of the above variable with another variable: w1ageint 
(respondent's age). 


I need to calculate how many of the above 20 variables have values that are 
greater than w1ageint. In this way, I would know how many siblings a respondent 
would have that are older the respondent.

In this case, how should I write out the program?

Nick Cox <[email protected]>

First off, a -foreach- loop over the integers 1/20 is better written as a 
-forval- loop 


forval n = 1/20 { 

} 

But more importantly, 

1. Looping sounds a bad way to do what you want.  

2. You are treating macros as if they were variables, which is a major 
misunderstanding.

You'd be better off explaining the structure of your data and what you want to 
do in words, and then you'll probably get better advice on what you should do. 

P.S. please see Statalist advice: 

http://www.stata.com/support/faqs/res/statalist.html#tojoin

especially 2.1.3. 

P C
===

I have a loop question. 

I want to do something like this:

local i=0
gen w1ttflsbyger=.
foreach n in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20{
 replace w1ttflsbyger=`i'+1 if w1flsibage`n'<w1ageint & w1flsibage`n'!=. & 
w1ageint~=.
 replace i=`i'+1 if w1flsibage`n'<w1ageint & w1flsibage`n'!=. & w1ageint~=.
}

Of course, the last line of the syntax was wrong. Basically, I want to write 
something to let "i" to increase by 1 if the condition: "w1flsibage`n'<w1ageint 
& w1flsibage`n'!=. & w1ageint~=." are satisfied. Otherwise, "i" won't increase 
by 1 and will jump out of the loop.

How should I write the loop?

*
*   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–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index