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: reverse lookup
From
daniel klein <[email protected]>
To
[email protected]
Subject
Re: st: reverse lookup
Date
Wed, 9 Jan 2013 18:13:19 +0100
Guess at this point the Mata approach, sketched out earlier, seems
more convenient. With numeric variables only, and not "too many
values", one could also think of -tabulate- with -matrow- option.
pr vlookup ,rclass
vers 9.2
syntax varname [if][in] [, Local(name local)]
marksample touse ,nov s
qui cou if `touse'
if !(r(N)) err 2000
cap conf numeric v `varlist'
loc isstr = _rc
m : mvlookup("`varlist'", "`touse'", `isstr')
di `"`macval(val)'"'
if ("`local'" != "") c_local `local' `"`macval(val)'"'
ret loc values `"`macval(val)'"'
ret sca matches = `matches'
end
vers 9.2
m :
void mvlookup(string scalar varn, string scalar tu, real scalar isstr)
{
transmorphic matrix X
string scalar val
if (isstr) X = st_sdata(., varn, tu)
else X = strofreal(st_data(., varn, tu), st_varformat(varn))
if (isstr) {
if (!strpos(X[1, 1], `"""')) val = `"""' + X[1, 1] + `"""'
else val = "`" + `"""' + X[1, 1] + `"""' + "'"
}
else val = X[1, 1]
if (!allof(X, X[1, 1])) {
for (i = 2; i <= rows(X); ++i) {
if (isstr) {
if (!strpos(X[i, 1], `"""')) {
val = val + " " + `"""' + X[i, 1] + `"""'
}
else {
val = val + " " ///
+ "`" + `"""' + X[i, 1] + `"""' + "'"
}
}
else val = val + " " + X[i, 1]
}
}
st_local("val", val)
st_local("matches", strofreal(rows(X)))
}
end
Best
Daniel
--
Yes, the sort works as well for strings.
I'm thinking of a program will return the list of matches, along with
a flag regarding uniqueness, because in some contexts it's good have
the set of matching values. But no need to post it here (grin).
*
* 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/