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: rename |
Date | Thu, 9 Aug 2012 17:56:37 +0100 |
I'd agree with the principle but not the way to do it. -assert- is intended to check whether something is true of the data. In principle it checks every observation to see if something is true of every observation. I don't know _exactly_ how smart it is at spotting tests that are independent of the data -- I'd expect some considerable intelligence on that front -- but if only on stylistic grounds I'd recommend something more direct like if `oldcount' != `newcount' { di as err "old # is `oldcount'; new # is `newcount': election fraud?" } I'd assert that you don't see examples like David's in Stata's own code. Nick On Thu, Aug 9, 2012 at 5:44 PM, David Radwin <dradwin@mprinc.com> wrote: > Also, if you want to automate the process for checking whether the number > of variables in the old list and the new list are the same, you could give > the two mycount macros different names and use the -assert- command like > this: > > . assert `oldcount' == `newcount' > > See Gould, W. 2003. Stata tip 3: How to be assertive. Stata Journal 3: > 448. http://www.stata-journal.com/article.html?article=dm0003 > > David > > -- > David Radwin > Senior Research Associate > MPR Associates, Inc. > 2150 Shattuck Ave., Suite 800 > Berkeley, CA 94704 > Phone: 510-849-4942 > Fax: 510-849-0794 > > www.mprinc.com > > >> -----Original Message----- >> From: owner-statalist@hsphsun2.harvard.edu [mailto:owner- >> statalist@hsphsun2.harvard.edu] On Behalf Of Nick Cox >> Sent: Thursday, August 09, 2012 8:32 AM >> To: statalist@hsphsun2.harvard.edu >> Subject: Re: st: rename >> >> Good news. You may be interested for future coding in small >> abbreviations of your code. >> >> gen rutgers2 = "m" + string(marker) if used == 0 >> replace rutgers2 = rutgers if used == 1 >> local end = _N >> forvalues i = 1/`end' { >> local next = rutgers2[`i'] >> local mynewvars `mynewvars' `next' >> } >> >> becomes >> >> /// assumes only values are 0 or 1 >> gen rutgers2 = cond(used == 0, "m" + string(marker), rutgers) >> >> forvalues i = 1/`=_N' { >> local mynewvars `mynewvars' `=rutgers[`i']' >> } >> >> On Thu, Aug 9, 2012 at 4:26 PM, Airey, David C >> <david.airey@vanderbilt.edu> wrote: >> > . >> > >> > Thanks to Nick and David, I got my rename groups code to work. Using >> > macro expansion I create a local macro containing the new variable >> > names that are in a string variable in a data set that is correctly >> > ordered by row to match a wide dataset in terms of variable order. I >> > create another local of the variables names in the wide dataset to be >> > renamed using the unab command. Then the new rename groups command >> > works great here, for 2129 variables, where the oldvars and newvars >> > are represented by locals. >> > >> > use markers_used.dta, clear >> > >> > // make local containing new variable names >> > // from a string variable contents (same order >> > // as variables in dataset to be renamed) >> > gen rutgers2 = "m" + string(marker) if used == 0 >> > replace rutgers2 = rutgers if used == 1 >> > local end = _N >> > forvalues i = 1/`end' { >> > local next = rutgers2[`i'] >> > local mynewvars `mynewvars' `next' >> > } >> > local mycount : word count `mynewvars' >> > display "`mycount'" // check if same as below >> > >> > // get local containing old variable names >> > use chr2_geno.dta, clear >> > unab myoldvars : m* >> > local mycount : word count `myoldvars' >> > display "`mycount'" // check if same as above >> > >> > // rename using new rename groups command >> > rename (`myoldvars') (`mynewvars') >> > drop m* >> > describe, short >> > >> > >> > // same effect in loop >> > /* >> > use chr2_geno.dta, clear >> > drop id famid >> > local nvars = r(k) >> > use chr2_geno.dta, clear >> > forvalues i = 1/`nvars' { >> > local oldname : word `i' of `myoldvars' >> > local newname : word `i' of `mynewvars' >> > rename `oldname' `newname' >> > } >> > drop m* >> > describe, short >> > */ >> > >> > >> > >> > >> >> sysuse auto >> >> rename (*) (<new list>) >> >> >> >> will work. >> >> >> >> Nick >> > >> >>> Maybe you could run it through a loop where the first word of the >> first >> >>> macro gets changed to the first word of the second macro, etc.? Like >> >> this: >> >>> >> >>> * Make fake dataset >> >>> set more off >> >>> clear >> >>> set obs 1 >> >>> forvalues i = 1/1000 { >> >>> gen oldvar`i' = . >> >>> } >> >>> >> >>> * Make list of new variable names >> >>> forvalues i = 1/1000 { >> >>> local newnames `newnames' newvar`i' >> >>> } >> >>> >> >>> * Change all variable names >> >>> local j = 1 >> >>> unab original : oldvar* >> >>> forvalues j = 1/1000 { >> >>> local oldname : word `j' of `original' >> >>> local newname : word `j' of `newnames' >> >>> rename `oldname' `newname' >> >>> } >> * >> * 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/ > * > * 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/ * * 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/