| |
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]
Re: st: Using one variable to label another
Thanks Nick, I usually make this mistake the first time
through.
Nick Cox wrote:
The principle is right, but you'll need to tweak
what is here, which won't work.
Each line
label define mylab v1[`n'] "v2[`n']", modify
should be more like
label define mylab `=v1[`n']' "`=v2[`n']'", modify
Note that here there are no checks here on what should be
the case.
The -labmask- program mentioned earlier has more checks.
But don't cut and paste from here. Install -labutil- from SSC.
------------------------------------ labmask.ado
*! NJC 1.0.0 20 August 2002
* values of -values-, or its value labels, to be labels of -varname-
program def labmask, sortpreserve
version 7
syntax varname(numeric) [if] [in], /*
*/ VALues(varname) [ LBLname(str) decode ]
* observations to use
marksample touse
qui count if `touse'
if r(N) == 0 {
error 2000
}
* integers only!
capture assert `varlist' == int(`varlist') if `touse'
if _rc {
di as err "may not label non-integers"
exit 198
}
tempvar diff decoded group example
* do putative labels differ?
bysort `touse' `varlist' (`values'): /*
*/ gen byte `diff' = (`values'[1] != `values'[_N]) * `touse'
su `diff', meanonly
if r(max) == 1 {
di as err "`values' not constant within groups of `varlist'"
exit 198
}
* decode? i.e. use value labels (will exit if value labels not assigned)
if "`decode'" != "" {
decode `values', gen(`decoded')
local values "`decoded'"
}
* we're in business
if "`lblname'" == "" {
local lblname "`varlist'"
}
* groups of values of -varlist-; assign labels
by `touse' `varlist' : /*
*/ gen byte `group' = (_n == 1) & `touse'
qui replace `group' = sum(`group')
gen long `example' = _n
local max = `group'[_N]
forval i = 1 / `max' {
su `example' if `group' == `i', meanonly
local label = `values'[`r(min)']
local value = `varlist'[`r(min)']
label def `lblname' `value' `"`label'"', modify
}
label val `varlist' `lblname'
end
---------------------------------
Nick
[email protected]
Jeph Herrin
Not efficient, but effective:
local N=_N
forv n=1/`N' {
label define mylab v1[`n'] v2[`n'], modify
}
label values v1 mylab
If your dataset is large, you may want to first
preserve
bys v1 : keep if _n==1
local N=_N
forv n=1/`N' {
label define mylab v1[`n'] "v2[`n']", modify
}
restore
label values v1 mylab
Doogar, Rajib wrote:
In Stat 9.2, how can I use the values of v2 (str 40, say)
to label v1
(int)? My data looks something like this:
V1 V2
1234 somerandomstring1
1234 somerandomstring1
2345 somerandomstring2
....
6578 somerandomstringn
....
etc.
I tried to encode v2 and then attach the resulting label to v1. I
encoded v2 all right, but then got stumped by how correctly
to link the
labels to the values of v1. Encoding v2 gave me labels
numbered 1 to
xxx, but v1 is a four digit number (although it does take
exactly xxx
distinct values).
*
* 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/
*
* 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/