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

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

From   "Martin Weiss" <>
To   <>
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 :-)


-----Ursprüngliche Nachricht-----
[] Im Auftrag von Li, Ihsuan
Gesendet: Montag, 6. April 2009 18:05
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!!


-----Original Message-----
[] On Behalf Of Nick Cox
Sent: Tuesday, March 24, 2009 11:23 AM
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-


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
Stata to replace with "name"?
Also, you do not specify an "in" qualifier for the last line, so Stata
default -replace-s the whole vector of "matchernum"s with the value
which is the only one that matches in your example data. (I assume that
"matcheri" and "matcherj" are filled with ones because you copied from
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
dataset between the original and the to-be-matched firms and then
them back.

Li, Ihsuan

I am sorry about the variable names. Here is the actual codes and
There are 459 observations, listed are results for eight observations. 
Instead of a column of the names of the matched companies under
I get one same number under it.
For example, in row five, cusip #40707105, the company is Hamilton bros,
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'] !=.


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
4		Bering Strait	3506		4833	1
40707105	HAMILTON BROS	.		9118	.
81611405	SEITEL INC		.		4742	.
1		9118
82524102	SHOREWOOD CORP	.		7864	.
82770101	SILVER DINER 	.		4235	.

*   For searches and help try:

*   For searches and help try:

*   For searches and help try:

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