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 |
Nick Cox <njcoxstata@gmail.com> |

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

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

Date |
Thu, 31 Oct 2013 23:27:42 +0000 |

Thanks for the clarification. Note that in long structure (!) your entire operation would just be one line, something like by obs: drop if hosp == hosp[_n-1] or by obs: keep if hosp != hosp[_n-1] Nick njcoxstata@gmail.com On 31 October 2013 19:23, Robbie Katz <robbiekatz05@gmail.com> wrote: > 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/ * * 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:*Robbie Katz <robbiekatz05@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>

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

- Prev by Date:
**st: Fwd: psmatch2 kernel matching** - Next by Date:
**Re: st: forvalues foreach or while loop for sequential variables** - 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):