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]
Re: st: forvalues foreach or while loop for sequential variables
From
Robbie Katz <[email protected]>
To
[email protected]
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 <[email protected]> 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
> [email protected]
>
>
> On 31 October 2013 19:23, Robbie Katz <[email protected]> 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 <[email protected]> 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
>>>> [email protected]
>>>>
>>>>
>>>> On 31 October 2013 07:32, A Loumiotis <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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/