Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

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

From |
Robbie Katz <robbiekatz05@gmail.com> |

To |
statalist@hsphsun2.harvard.edu |

Subject |
Re: st: forvalues foreach or while loop for sequential variables |

Date |
Thu, 31 Oct 2013 15:23:26 -0400 |

Thanks Roberto, A Loumiotis, and Nick! I should have mentioned this earlier but, the variables are date variables, and the data set was previously in a long format. The problem 1, identified by Nick will not occur because I sorted the variable hosp, before reshaping to wide, so something like "6,9,6" will not occur. However, something like "5,5,5," could occur, and the code that I had would miss that, but looks like Nick's solution is apt to avert this problem. Nick I think I sort of answered your question above, but I need to throw away the extra dates if they are repeated as they don't add any extra information. Thank you guys a bunch! On Thu, Oct 31, 2013 at 5:12 AM, Nick Cox <njcoxstata@gmail.com> wrote: > (Revised version of previous) > > This picks up the syntax Robbie was missing, namely > > `=exp' > > for some expression exp, but it won't work entirely as desired. > Suppose -hospital7- -hospital8- -hospital9- are all 42. Then > -hospital8- is changed to missing because it is the same as > -hospital7-, but next time around the loop -hospital9- of 42 is > compared with missing and nothing is changed. > > Roberto pointed out this problem too. > > The following should be an improvement for a solution without -reshape-. > > clear > input obs hosp14 hosp15 hosp16 > 1 1 5 5 > 2 6 9 6 > 3 8 1 3 > 4 5 5 5 > 5 2 2 2 > 6 2 9 1 > 7 1 1 1 > 8 3 1 7 > 9 3 0 4 > end > > gen previous = hosp14 > gen temp = . > > qui forval j = 15/16 { > replace temp = hosp`j' > replace hosp`j' = . if hosp`j' == previous > replace previous = temp > } > > drop previous temp > > That said, > > 1. The non-missing values left will not be guaranteed unique or > distinct. Hospitals 6, 9, 6 visited in that order will be left as is > and 6 will occur twice. > > 2. Throwing away information is always risky. Why do you want to do this? > > 3. As these are in essence panel data, Roberto's implication that in > many ways you are better off with a long data structure (I don't like > the word "format" here) is worth pondering. > >> Nick >> njcoxstata@gmail.com >> >> >> On 31 October 2013 07:32, A Loumiotis <antonis.loumiotis@gmail.com> wrote: >>> another way without defining a new local would be: >>> >>> replace hosp`num'=. if hosp`num'==hosp`=`num'-1' >>> >>> Antonis >>> >>> On Thu, Oct 31, 2013 at 8:52 AM, Roberto Ferrer <refp16@gmail.com> wrote: >>>> Elaborating a bit more, according to your example, you intend >>>> something along the lines of: >>>> >>>> *-------- begin code --------- >>>> clear >>>> set more off >>>> >>>> input obs hosp14 hosp15 hosp16 >>>> 1 1 5 5 >>>> 2 6 9 6 >>>> 3 8 1 3 >>>> 4 5 5 5 >>>> 5 2 2 2 >>>> 6 2 9 1 >>>> 7 1 1 1 >>>> 8 3 1 7 >>>> 9 3 0 4 >>>> end >>>> >>>> list >>>> >>>> * You have this in a loop >>>> replace hosp15 = . if hosp15 == hosp14 >>>> list >>>> *--------- end code ---------- >>>> >>>> but this compares only contiguos hospitals (14 with 15 and 15 with 16) but not >>>> hospitals that are "further apart" (14 with 16). This is the case with >>>> observation 2 in the example data I created. Your loop misses this comparison, >>>> which I assume is important, i.e., you want hosp16 to equal . >>>> for that observation because hosp14 already takes the value of 6. If >>>> the assumption >>>> is true, this is very problematic. >>>> >>>> That said, now take a look at what your variables are evaluating to >>>> inside the loop >>>> (use -display- for this): >>>> >>>> *-------- begin code --------- >>>> clear >>>> set more off >>>> >>>> input obs hosp14 hosp15 hosp16 >>>> 1 1 5 5 >>>> 2 6 9 6 >>>> 3 8 1 3 >>>> 4 5 5 5 >>>> 5 2 2 2 >>>> 6 2 9 1 >>>> 7 1 1 1 >>>> 8 3 1 7 >>>> 9 3 0 4 >>>> end >>>> >>>> forvalues num=15/16 { >>>> display "hosp`num'" // your LHS >>>> display "hosp``num'-1'" // your RHS >>>> replace hosp`num'=. if hosp`num'==hosp``num'-1' >>>> } >>>> >>>> *--------- end code ---------- >>>> >>>> The LHS is OK, but the RHS is always evaluating to "hosp". You do not >>>> specify your >>>> error in your post (you mention "it didn't work" and you should be >>>> specific about it) >>>> but here I get this: >>>> >>>> hosp ambiguous abbreviation >>>> r(111); >>>> >>>> Stata doesn't know if you're refering to hosp14, hosp15 or hosp16, and >>>> so it halts >>>> with an error. >>>> >>>> Because I mess up easily with all the quotes (maybe someone will >>>> clarify this point), >>>> my strategy is to declare a new local and then use it for the RHS: >>>> >>>> *--- >>>> forvalues num=15/16 { >>>> local newnum = `num' - 1 >>>> replace hosp`num' = . if hosp`num' == hosp`newnum' >>>> } >>>> *--- >>>> >>>> I hope this helps. >>>> >>>> On Thu, Oct 31, 2013 at 1:42 AM, Roberto Ferrer <refp16@gmail.com> wrote: >>>>> Robbie, >>>>> >>>>> Here is one way avoiding the loop and using -reshape-. >>>>> >>>>> *-------begin code --------- >>>>> >>>>> clear >>>>> set more off >>>>> >>>>> input obs hosp14 hosp15 hosp16 >>>>> 1 1 5 5 >>>>> 2 6 9 6 >>>>> 3 8 1 3 >>>>> 4 5 5 5 >>>>> 5 2 2 2 >>>>> 6 2 9 1 >>>>> 7 1 1 1 >>>>> 8 3 1 7 >>>>> 9 3 0 4 >>>>> end >>>>> >>>>> list >>>>> >>>>> * Reshape to manipulate >>>>> reshape long hosp, i(obs) j(hnum) >>>>> >>>>> sort obs hosp hnum // important >>>>> gen hosp2 = hosp >>>>> by obs: replace hosp2 = . if hosp[_n] == hosp[_n-1] >>>>> >>>>> drop hosp >>>>> rename hosp2 hosp >>>>> >>>>> * Take back to original form >>>>> reshape wide hosp, i(obs) j(hnum) >>>>> list // compare this with original input >>>>> >>>>> *------- end code --------- >>>>> >>>>> On Thu, Oct 31, 2013 at 12:41 AM, Robbie Katz <robbiekatz05@gmail.com> wrote: >>>>>> I have a wide format data with variables with same text and different >>>>>> numbers attached to them. The variables look like this: hospital1 >>>>>> hospital2 hospital3...hospital15. I want only unique values across >>>>>> these variable for any one observation. For instance if both hospital >>>>>> 15 and hospital14 have the same value say, 10, then I want to delete >>>>>> 10 and replace it with "." for hospital15. Please let me know how I >>>>>> can run a loop to achieve this. >>>>>> >>>>>> I tried the following but it didn't work: >>>>>> forvalues num=2/15 { >>>>>> replace hospital`num'=. if hospital`num'==hospital``num'-1' >>>>>> } >>>>>> >>>>>> Please help, >>>>>> Thanks! >>>>>> * >>>>>> * 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/ >>>> * >>>> * 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/ >>> * >>> * 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/ > * > * 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/ * * 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/

**Follow-Ups**:**Re: st: forvalues foreach or while loop for sequential variables***From:*Nick Cox <njcoxstata@gmail.com>

**References**:**st: forvalues foreach or while loop for sequential variables***From:*Robbie Katz <robbiekatz05@gmail.com>

**Re: st: forvalues foreach or while loop for sequential variables***From:*Roberto Ferrer <refp16@gmail.com>

**Re: st: forvalues foreach or while loop for sequential variables***From:*Roberto Ferrer <refp16@gmail.com>

**Re: st: forvalues foreach or while loop for sequential variables***From:*A Loumiotis <antonis.loumiotis@gmail.com>

**Re: st: forvalues foreach or while loop for sequential variables***From:*Nick Cox <njcoxstata@gmail.com>

**Re: st: forvalues foreach or while loop for sequential variables***From:*Nick Cox <njcoxstata@gmail.com>

- Prev by Date:
**Re: st: problem with Margin command and interaction graph in fixed effect logistic regression** - Next by Date:
**st: Copying data from an observation to a different time period, using bysort** - Previous by thread:
**Re: st: forvalues foreach or while loop for sequential variables** - Next by thread:
**Re: st: forvalues foreach or while loop for sequential variables** - Index(es):