OK. Let's see how that would work. Let's imagine
Example 1
=========
Afoo1 - Afoo9
Bfoo1 - Bfoo9
...
Zfoo1 - Zfoo9
is an example of a set of variables with both
prefixes and suffixes. As you postulate, each prefix is
no longer unique. You could cycle over
the prefixes -- but note the crucial assumption that
_no_ other variable starts with each prefix --
foreach l in `c(Alpha)' {
renpfix `l'
foreach v of var foo* {
rename `v' `v'`l'
}
}
and you end up with
foo1A-foo9A
foo1B-foo9B
...
foo1Z-foo9Z
If you what you wanted was
fooA1-fooA9
fooB1-fooB9
..
fooZ1-fooZ9
you would need to do more work.
Now how about a direct attack?
foreach v of var *foo* {
local pre = substr("`v'",1,index("`v'", "foo") - 1)
local post = substr("`v'",index("`v'", "foo") + 1,.)
rename `v' foo`pre'`post'
}
or whatever.
Example 2
=========
Or, let's go for a different set-up.
Afoo, Abar, Abazz, ..., Afrog, Anewt, Atoad
Bfoo, ..., Btoad
...
Zfoo, ..., Ztoad
foreach l in `c(Alpha)' {
renpfix `l'
foreach v of var foo-toad {
rename `v' `v'`l'
}
}
and you end up with
fooA-toadA
...
fooZ-toadZ
A direct attack in this case could be
foreach v of var Afoo-Ztoad {
local pre = substr("`v'",1,1)
local stub = substr("`v'",2,.)
rename `v' `stub'`pre'
}
or whatever. In each case, I made equally
demanding assumptions about variable order
that might not be true.
Comparisons
===========
So, two warnings about using -renpfix-:
1. Using -renpfix- means you have to be careful
that the prefix is shared only by the variables
you want to rename.
2. If you strip a prefix, you may need to rename
the bare variables promptly before doing something
else.
As for what I called a direct attack:
1. In each second code fragment, only one loop is needed.
Also, I think it's simpler overall.
2. I can't think that comparable warnings are needed.
You may be thinking of something a bit different, and
I constructed my examplesto favour my prejudices.
That said, I'm just not convinced that -renpfix- is
especially helpful for this kind of problem.
Nick
[email protected]
Paul Millar
> A good solution Nick. I maintain that renpfix may still be a good
> solution for such situations where the prefix A*, B*, C* is for each
> wave or cycle of a survey. If there are a hundred or more variables
> and only a few cycles, the -renpfix- is a better approach. It
> depends on what there is more of.
Nick Cox
> >Various suggestions were made in this thread. In
> >general, use of -reshape-'s advanced syntax seems
> >most direct to me. But renaming solutions are
> >of interest for many other problems and I will
> >focus on those.
> >
> >Using -renpfix- is not a good solution.
> >Here the prefix is variable, not constant.
> >That is, within
> >
> >ASMOK BSMOK CSMOK
> >
> >the prefix is variously A B C.
> >
> >So -renpfix- offers no advantage over
> >one by one -rename-s in this instance.
> >
> >Another solution is
> >
> >foreach v of var *SMOK {
> > local pre = substr("`v'",1,index("`v'", "SMOK")-1)
> > rename `v' SMOK`pre'
> >}
> >
> >For who prefer the user-written -renvars- from the SJ,
> >a solution is possible in the same spirit
> >
> >renvars *SMOK, map("SMOK" + substr("@",1,index("@","SMOK")-1))
> >
> >Alternatively,
> >
> >foreach v of var *SMOK {
> > local pre : subinstr local v "SMOK" ""
> > rename `v' SMOK`pre'
> >}
> >
> >with again a -renvars- analog, something like this:
> >
> >renvars *SMOK, map("SMOK" + `"`: subinstr local v "SMOK" ""'"')
> >
> >Tricky, but it can be done! I prefer
> >
> >foreach v of var *SMOK {
> > local pre : subinstr local v "SMOK" ""
> > rename `v' SMOK`pre'
> >}
> >
> >to using -renvars- in this case.
> >
> >Nick
> >[email protected]
> >
> >Paul Millar
> >
> > > Another approach might be to use the renpfix command, which
> > > renames (or removes the prefix) see -whelp renpfix-
> > >
> > > Once the prefix is removed it is easy to reshape.
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/