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]

st: inexplicable foreach problem


From   "Jennifer S. Earl" <jearl@soc.ucsb.edu>
To   statalist@hsphsun2.harvard.edu
Subject   st: inexplicable foreach problem
Date   Wed, 13 Jul 2011 20:28:46 -0700

I am hoping someone else can give me some perspective on this. I have a program in which I am using lots of foreach statements. For instance, here is one that works (statement first and then log):

Programming (pardon the wrapping text if you email program wraps the line):

foreach i in 2005/2010 {
	replace mod1_err013=eventid if population_`i'==. & sample_rate_`i'!=.
	replace mod1_err013=eventid if population_`i'!=. & sample_rate_`i'==.
	replace mod1_err013=eventid if population_`i'==. & man_weight_`i'!=.
	replace mod1_err013=eventid if population_`i'!=. & man_weight_`i'==.
	replace mod1_err013=eventid if sample_rate_`i'==. & man_weight_`i'!=.
	replace mod1_err013=eventid if sample_rate_`i'!=. & man_weight_`i'==.
}

Successful log entry:
. foreach i in 2005/2010 {
2. replace mod1_err013=eventid if population_`i'==. & sample_rate_`i'
!=.
3. replace mod1_err013=eventid if population_`i'!=. & sample_rate_`i'
==.
4. replace mod1_err013=eventid if population_`i'==. & man_weight_`i'!
=.
5. replace mod1_err013=eventid if population_`i'!=. & man_weight_`i'=
=.
6. replace mod1_err013=eventid if sample_rate_`i'==. & man_weight_`i'
!=.
7. replace mod1_err013=eventid if sample_rate_`i'!=. & man_weight_`i'
==.
 8. }
(0 real changes made)
(0 real changes made)
(0 real changes made)
(2 real changes made)
(0 real changes made)
(0 real changes made)


But, when I try to execute exactly the same foreach line after that, the program doesn't try to iterate between 2005-2010;

Unsuccessful programming:

foreach i in 2005/2010 {
	gen plus3000_`i'=0
	replace plus3000_`i'=1 if sample_rate_`i'==98
	replace plus3000_`i'=2 if sample_rate_`i'==99
}

Here's what the trace shows is happening when it breaks (which reveals the new variable is being named plus3000_2005/2010 instead of plus3000_2005):

. foreach i in 2005/2010 {
 2.
. gen plus3000_`i'=0
 3.
. replace plus3000_`i'=1 if sample_rate_`i'==98
 4.
. replace plus3000_`i'=2 if sample_rate_`i'==99
 5.
. }
- foreach i in 2005/2010 {
- gen plus3000_`i'=0
= gen plus3000_2005/2010=0
/ invalid name
 replace plus3000_`i'=1 if sample_rate_`i'==98
 replace plus3000_`i'=2 if sample_rate_`i'==99
 }
r(198);

I know its not a typo because I have copied and replaced the foreach line from the good programming about 10 times to the same result. The only thing in between the foreach loops that work and those that don't are some comments and some egen statements.

Any ideas on this one-- its a total mystery to me!

Thanks,

Jenn

*********************************
Jennifer Earl
Professor of Sociology
SS&MS 3129
University of California, Santa Barbara
Santa Barbara, CA  93106-9430

P: (805) 893-7471
F: (805) 893-3324
http://www.soc.ucsb.edu/faculty/earl/
*********************************
*
*   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–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index