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]

st: re: strange foreach loop result


From   "Airey, David C" <david.airey@vanderbilt.edu>
To   "statalist@hsphsun2.harvard.edu" <statalist@hsphsun2.harvard.edu>
Subject   st: re: strange foreach loop result
Date   Wed, 15 Dec 2010 11:18:47 -0600

.

Thank you all for the rapid help and solution.

Ah, you are brilliant. That is exactly what happened. Got to be careful about quotes in Stata. I had forgotten the quotes and was indeed comparing the variable contents rather than the variable names. Thanks so much for that. I had been staring at it for over an hour.


>> David,
>> 
>> I guess what you want to do is something like this:
>> 
>> use result_pilot.dta, clear
>> keep slope lower upper ed50
>> foreach var of varlist slope lower upper ed50 {
>>         if "`var'" == "slope" local myvar 1
>>         if "`var'" == "lower" local myvar 2
>>         if "`var'" == "upper" local myvar 3
>>         if "`var'" == "ed50" local myvar 4
>>         display "`var'", "`myvar'"
>> }
>> 
>> 
>> I.e. you want to compare the variable names, i.e. strings, not the values that the variables have. I guess both the variables slope and ed50 have the same values in the first observation, so you overwrite your local with 4 in the first loop run.
>> You can verify this easily
>> 
>> di slope
>> di ed50
>> 
>> which is equivalent to
>> di slope[1]
>> di ed50[1]
>> 
>> best
>> 
>> Klaus
>> 
>> 
> 
> I'm getting a really strange foreach loop result I don't understand.
> 
> In the first code snippet on fictitious data, I get what I want. In the second code snippit on the real data I get a strange result for when the condition:
> 
> if `var' == slope local myvar 1
> 
> is evaluated when `var' is slope. It produces the result myvar==4, when it should return myvar==1.
> 
> Anyone have a clue where my error is?
> 
> 
> clear
> set obs 10
> gen a = 1
> gen b = 2
> gen c = 3
> gen d = 4
> foreach var of varlist a b c d {
> 	if `var' == a local myvar 1
> 	if `var' == b local myvar 2
> 	if `var' == c local myvar 3
> 	if `var' == d local myvar 4
> 	display "`var'", "`myvar'"
> }
> 
> produces:
> 
> a 1
> b 2
> c 3
> d 4
> 
> 
> use result_pilot.dta, clear
> keep slope lower upper ed50
> foreach var of varlist slope lower upper ed50 {
> 	if `var' == slope local myvar 1
> 	if `var' == lower local myvar 2
> 	if `var' == upper local myvar 3
> 	if `var' == ed50 local myvar 4
> 	display "`var'", "`myvar'"
> }
> 
> produces:
> 
> slope 4 <--weird, should be slope 1
> lower 2
> upper 3
> ed50 4
> 

*
*   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