Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | "Joseph Coveney" <stajc2@gmail.com> |
To | <statalist@hsphsun2.harvard.edu> |
Subject | st: Re: Replace current values matching certain condition using values from other observations? |
Date | Sat, 25 Jan 2014 17:33:22 +0900 |
Chris Yang wrote: I have a dataset that resembles the following structure: group seq var1 var2 var3 1 1 3 2 3 1 2 1 1 2 1 3 2 2 4 2 1 3 2 1 2 2 3 3 3 3 1 3 2 1 ... Now, within each group, for all the observations whose seq > 1, I want to replace the values for var1 and var2 with those of the observation whose seq == 1. For example, for group 1 above, after the replacements, it would look like this: group seq var1 var2 var3 1 1 3 2 3 1 2 3 2 2 1 3 3 2 4 If there is no seq > 1 in a given group, then no replacement is needed. Intuitively, it seems that I need a looping structure to go through all the observations one by one. And at each step i will check the seq variable. If it is greater than 1, then look up the values for var1 and var2 from the observation *within the same group* whose seq == 1, and use them to update the current observation. The question is that how do I do such look-ups in a loop? As always, is there a better/more efficient way of doing it? Your thoughts and suggestions are appreciated. -------------------------------------------------------------------------------- In Stata, you tend to avoid looping over data. You can often take advantage of the fact that its data operations are "vectorized". Joseph Coveney . input byte(group seq var1 var2 var3) group seq var1 var2 var3 1. 1 1 3 2 3 2. 1 2 1 1 2 3. 1 3 2 2 4 4. 2 1 3 2 1 5. 2 2 3 3 3 6. 3 1 3 2 1 7. end . . bysort group (seq): replace var1 = var1[1] if seq > 1 (2 real changes made) . by group: replace var2 = var2[1] if seq > 1 (2 real changes made) . . list, noobs sepby(group) +----------------------------------+ | group seq var1 var2 var3 | |----------------------------------| | 1 1 3 2 3 | | 1 2 3 2 2 | | 1 3 3 2 4 | |----------------------------------| | 2 1 3 2 1 | | 2 2 3 2 3 | |----------------------------------| | 3 1 3 2 1 | +----------------------------------+ . . exit end of do-file * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/faqs/resources/statalist-faq/ * http://www.ats.ucla.edu/stat/stata/