[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

From |
"Martin Weiss" <martin.weiss1@gmx.de> |

To |
<statalist@hsphsun2.harvard.edu> |

Subject |
st: AW: RE: RE: AW: RE: Re: loop code problem |

Date |
Mon, 6 Apr 2009 18:10:04 +0200 |

<> Nick said quite rightly that the -merge- approach may not be the best here. The long wait made me think that you had found a solution yourself. I hope that other listers will come forward with better suggestions :-) HTH Martin -----Ursprüngliche Nachricht----- Von: owner-statalist@hsphsun2.harvard.edu [mailto:owner-statalist@hsphsun2.harvard.edu] Im Auftrag von Li, Ihsuan Gesendet: Montag, 6. April 2009 18:05 An: statalist@hsphsun2.harvard.edu Betreff: st: RE: RE: AW: RE: Re: loop code problem Hi Nick, Martin: It is a bit late, but wanted to let you know that the coding worked after sorting the two sets of companies and doing: gen matchname=. forvalues i=1(1) 265 { forvalues j= 1(1) 459 { if lister[`i'] == id[`j'] & lister[`i'] < . { replace matchname=name[`j'] in `i' } } } I tried "merge" before and that did not work. Many thanks!! Ihsuan -----Original Message----- From: owner-statalist@hsphsun2.harvard.edu [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Nick Cox Sent: Tuesday, March 24, 2009 11:23 AM To: statalist@hsphsun2.harvard.edu Subject: st: RE: AW: RE: Re: loop code problem Just to expand briefly on Martin's main comment: As they say in some old tales, your punishment is that you got what you asked for. If we forget missings for a moment, the main idea in the problematic line is replace matchernum = lister[`i'] if lister[`i'] == id[`j'] Now suppose that -lister- and -id- are identical for a particular pair of observations, say at 42. Then the line becomes replace matchernum = lister[`i'] if 42 == 42 But -if 42 == 42- is true for observations 1, 2, 3, etc. so -matchnum- is replaced in all observations. You can fix this by adding an -in- condition, but it would be better to do this, to make the logic clearer if lister[`i'] == id[`j'] & lister[`i'] != . & id[`j'] != . { replace matchernum = lister[`i'] in `j' } This could be slimmed to if lister[`i'] == id[`j'] & lister[`i'] < . { replace matchernum=lister[`i'] in `j' } If they're equal, then only one need be tested as non-missing, and we can save a keystroke too. By the way, it's not at all obvious to me that this is a -merge- problem. Nick n.j.cox@durham.ac.uk Martin Weiss The problem with your code is the last line inside the loop: You specifically instruct Stata to replace "matchernum" with "lister" and subsequently complain that it contains this very number. Why not instruct Stata to replace with "name"? Also, you do not specify an "in" qualifier for the last line, so Stata by default -replace-s the whole vector of "matchernum"s with the value 9118, which is the only one that matches in your example data. (I assume that the "matcheri" and "matcherj" are filled with ones because you copied from the full dataset of 459 observations. when I rerun your code, only observation 1 and 5 get a one.) I would advise you to look at -merge- as a much better solution. Split the dataset between the original and the to-be-matched firms and then -merge- them back. Li, Ihsuan I am sorry about the variable names. Here is the actual codes and results. There are 459 observations, listed are results for eight observations. Instead of a column of the names of the matched companies under matchernum, I get one same number under it. For example, in row five, cusip #40707105, the company is Hamilton bros, its unique id is 9118, it was matched to Atna (row1). Two questions really: 1. why is it returning identical number under matchernum? 2. how can I get it return the "name" instead of the id? I hope I am making sense now. gen matcheri=. gen matcherj=. gen matchernum=. forvalues i=1(1) 459 { forvalues j=`i'(1) 459 { replace matcheri=1 in `i' if lister[`i']== id[`j'] & lister[`i']!=. & id[`j'] !=. replace matcherj=1 in `j' if lister[`i']== id[`j'] & lister[`i']!=. & id[`j'] !=. replace matchernum=lister[`i'] if lister[`i']== id[`j'] & lister[`i']!=. & id[`j'] !=. } } Result: cusip name lister id matcheri matcherj matchernum 1 Ahtna 9118 4837 1 . 9118 2 Aleut 4654 4885 1 . 9118 3 Arctic Slope 278 9133 1 . 9118 4 Bering Strait 3506 4833 1 . 9118 40707105 HAMILTON BROS . 9118 . 1 9118 81611405 SEITEL INC . 4742 . 1 9118 82524102 SHOREWOOD CORP . 7864 . 1 9118 82770101 SILVER DINER . 4235 . 1 9118 * * 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/ * * 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/ * * 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/

**References**:**st: RE: RE: AW: RE: Re: loop code problem***From:*"Li, Ihsuan" <ihsuan.li@mnsu.edu>

- Prev by Date:
**st: DC conf 30-31 July: call for presentations** - Next by Date:
**st: AW: RE: Xtivreg2 with RE?** - Previous by thread:
**st: RE: RE: AW: RE: Re: loop code problem** - Next by thread:
**st: DC conf 30-31 July: call for presentations** - Index(es):

© Copyright 1996–2017 StataCorp LLC | Terms of use | Privacy | Contact us | What's new | Site index |