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 19:47:06 -0400 |

That's true. Yep, that would have been much simpler. Thanks. On Thu, Oct 31, 2013 at 7:27 PM, Nick Cox <njcoxstata@gmail.com> wrote: > 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/ * * 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/

**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>

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

- Prev by Date:
**Re: st: forvalues foreach or while loop for sequential variables** - Next by Date:
**Re: 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:
**st: Problem with stata concindexg command** - Index(es):