Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Nick Cox <njcoxstata@gmail.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: st: How to apply a command to numeric variables only |
Date | Wed, 30 May 2012 09:00:28 +0100 |
Note that you had > . foreach var of varlist srhcareactivity1-srhcareactivity6{ > 2. capture decode `var', generate(str) > 3. if _rc == 0 { > 4. drop `var' > 5. rename string `var' > 6. } > 7. } That should not have worked at all, because you create -str- and rename -string-. Further, note that -ds- and -findname- (SJ, SSC) both offer ways to select variables with value labels: ds, has(vall) findname, vall Nick On Wed, May 30, 2012 at 12:57 AM, Nick Cox <njcoxstata@gmail.com> wrote: > Comments embedded below. > > On Tue, May 29, 2012 at 9:58 PM, Paul O'Brien <paul.obrien@afe2.org.uk> wrote: >> These are the results: >> . ds srhcareactivity1-srhcareactivity6 , has(type numeric) >> srhcareact~4 srhcareact~5 srhcareact~6 >> >> . foreach var in `r(varlist)' { >> 2. decode `var', generate(string) >> 3. drop `var' >> 4. rename string `var' >> 5. } >> srhcareactivity4 not labeled >> r(182); >> === > > Your problem was posed that you want to -decode- variables, except > that you can't -decode- string variables. But you can't -decode- > variables without value labels either. So let's suppose you just want > a string version. > > foreach var in `r(varlist)' { > capture decode `var', generate(work) > if _rc gen work = string(`var') > drop `var' > rename work `var' > } > > I used the name -work- instead of -string-, if only as a matter of > style. This could fail to work well too, but you need to tell us more > about the data or about what you want to get better advice. > >> . findname srhcareactivity1-srhcareactivity6 , type(numeric) >> srhcareact~4 srhcareact~5 srhcareact~6 >> >> . foreach var in `r(varlist)' { >> 2. decode `var', generate(string) >> 3. drop `var' >> 4. rename string `var' >> 5. } >> srhcareactivity4 not labeled >> r(182); >> === > > That's the same problem. > >> . foreach var of varlist srhcareactivity1-srhcareactivity6{ >> 2. capture decode `var', generate(string) >> 3. if _rc == 0 { >> 4. drop `var' >> 5. rename string `var' >> 6. } >> 7. } >> unrecognized command: capture invalid command name >> r(199); >> === > > Can't see anything wrong there. > >> . ds srhcareactivity1-srhcareactivity6 , has(type numeric) >> srhcareact~4 srhcareact~5 srhcareact~6 >> >> . foreach var of varlist srhcareactivity1-srhcareactivity6{ >> 2. capture decode `var', generate(str) >> 3. if _rc == 0 { >> 4. drop `var' >> 5. rename string `var' >> 6. } >> 7. } >> >> but not decoded: >> srhcareactivi~4 byte %8.0g SRHCareActivity4 >> srhcareactivi~5 byte %8.0g SRHCareActivity5 >> srhcareactivi~6 byte %8.0g SRHCareActivity6 > > Quite so. The signal above was that the fourth variable was not > labelled. Therefore it can't be -decode-d. But the -capture- ate the > error, and the variable is unchanged. Same story with 5 and 6. > > It seems quite odd that variables with the name can present as (1) > string (2) numeric with value labels (3) numeric in different > datasets. Care to comment on why this happens? > > Nick >> >> >> Paul >> >> On 29 May 2012, at 11:00, Nick Cox wrote: >> >>> You are reporting problems but not the exact commands you tried. I >>> could try guessing what you did wrong, and whether it is my fault or >>> yours, but it is really is much better if you show your code. >>> >>> Nick >>> >>> On Tue, May 29, 2012 at 10:55 AM, paul o'brien <paul.obrien@afe2.org.uk> wrote: >>>> Thanks NIck, >>>> >>>> I encounter a problem with each of these suggestions: >>>> >>>> With ds and findname I get: srhcareactivity4 not labeled >>>> >>>> With -capture- inside the loop I get: variable string not found >>>> >>>> On keeping the label I get: unrecognized command: local invalid = >>>> command name >>>> >>>> Can you help? >>>> >>>> Thanks for all your very useful advice on the List. >>>> >>>> Paul >>>> >>>> >>>> On 29/05/2012, Paul O'Brien <paul.obrien@afe2.org.uk> wrote: >>>>> Thanks NIck, >>>>> >>>>> I encounter a problem with each of these suggestions: >>>>> >>>>> With ds and findname I get: srhcareactivity4 not labeled >>>>> >>>>> With -capture- inside the loop is get: variable string not found >>>>> >>>>> On keeping the label I get: unrecognized command: local invalid command >>>>> name >>>>> >>>>> Is there a tweak we are missing? >>>>> >>>>> Paul >>>>> >>>>> On 29 May 2012, at 08:27, Nick Cox wrote: >>>>> >>>>>> Similar questions arise often on this list. In your case one solution >>>>>> is to -destring- the string variables before the loop, but then the >>>>>> loop will convert back, so that does not appeal. >>>>>> >>>>>> Another is to select numeric variables beforehand. -ds- will do this >>>>>> >>>>>> ds srhcareactivity1-srhcareactivity6 , has(type numeric) >>>>>> >>>>>> foreach var in `r(varlist)' { >>>>>> >>>>>> -findname- (SJ) can do more than -ds- (fact) and has a better syntax >>>>>> (opinion), but its use is very similar here. >>>>>> >>>>>> findname srhcareactivity1-srhcareactivity6 , type(numeric) >>>>>> >>>>>> foreach var in `r(varlist)' { >>>>>> >>>>>> Another way is to use -capture- inside the loop. >>>>>> >>>>>> foreach var of varlist srhcareactivity1-srhcareactivity6{ >>>>>> capture decode `var', generate(string) >>>>>> if _rc == 0 { >>>>>> drop `var' >>>>>> rename string `var' >>>>>> } >>>>>> } >>>>>> >>>>>> Is it "string" a reserved word? (I am away from manuals at the >>>>>> moment.) I'd use something different here, even if not. >>>>>> >>>>>> Keeping the variable label can be done with extended macro functions, >>>>>> mentioned frequently on this list. >>>>>> >>>>>> foreach var of varlist srhcareactivity1-srhcareactivity6{ >>>>>> local varlabel : variable label `var' >>>>>> capture decode `var', generate(string) >>>>>> if _rc == 0 { >>>>>> drop `var' >>>>>> rename string `var' >>>>>> label var `var `varlabel' >>>>>> } >>>>>> } >>>>>> >>>>>> See -help extended fcn-. Or -help macro- first. >>>>>> >>>>>> Nick >>>>>> >>>>>> On Tue, May 29, 2012 at 6:28 AM, Paul O'Brien <paul.obrien@afe2.org.uk> >>>>>> wrote: >>>>>>> I want to do a foreach command to convert numeric variables to string >>>>>>> before a merge. Only some of the variables are numeric and which ones >>>>>>> varies with each database. >>>>>>> >>>>>>> foreach var of varlist srhcareactivity1-srhcareactivity6{ >>>>>>> decode `var', generate(string) >>>>>>> drop `var' >>>>>>> rename string `var' >>>>>>> } >>>>>>> >>>>>>> Error message: not possible with string variable. >>>>>>> >>>>>>> I have tried using capture to ignore the error. >>>>>>> >>>>>>> How can I restrict the command to numeric variables only? >>>>>>> >>>>>>> By the way, is there a way to keep the variable label which is lost when >>>>>>> I use generate. >>>>>>> * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/