假设我有一个名为MyVar的变量,其值标签定义如下:
0 Something
1 Something else
2 Yet another thing
如何获取第二个值标签(即“其他”)? 编辑:假设我不知道先验因子值是什么(即我不知道最小值标签,因子值可能会增加除以外的数字1,可能会不均匀地增加。)
我知道我可以获得与2的值对应的标签:
. local LABEL: label (MyVar) 2, strict
. di "`LABEL'"
Yet another thing
但我想在值标签列表中获取与位置对应的标签:
. <Some amazing Stata-fu using (labeled) variable MyVar and the position 2>
. di "`LABEL'"
Something else
答案 0 :(得分:4)
您想要嵌套extended macro functions matryoshkas之类的几个{{3}}:
clear
set obs 3
gen x=_n-1
label define xlab 0 "Something" 1 "Something else" 2 "Yet another thing"
lab val x xlab
levelsof x, local(xnumbers)
di "`:label xlab `:word 2 of `xnumbers'''"
从最后一行的末尾到前面。 levelsof
生成的本地xnumbers包含从最小到最大的x的不同级别:0 1 2.然后你弄清楚本地的第二个字是什么,即1.最后,你得到相应的标签到那个数字值,这是“别的东西”。
答案 1 :(得分:3)
您可以将标签放入Mata中的矢量中。
. sysuse auto, clear
(1978 Automobile Data)
. mata
------------------------------------------------- mata (type end to exit) --
: st_vlload("origin", values = ., text = "")
: values
1
+-----+
1 | 0 |
2 | 1 |
+-----+
: text
1
+------------+
1 | Domestic |
2 | Foreign |
+------------+
: text[2,1]
Foreign
: end
这可能是程序的核心,可以用它们做点什么。根据您的想法,可以扩展答案。无论您是从变量名称还是值标签名称开始,它都可以用于争夺。
编辑:这是一个快速破解程序返回第j个值标签。您提供一个名称,默认情况下将其视为变量名称;使用labelname
选项,它被视为值标签名称。测试不多。
*! 1.0.0 NJC 7 Oct 2014
program jthvaluelabel, rclass
version 9
syntax name , j(numlist int >0 min=1 max=1) [labelname]
if "`labelname'" == "" {
confirm var `namelist'
local labelname : value label `namelist'
if "`labelname'" == "" {
di as err "no value label attached to `namelist'"
exit 111
}
}
else {
local labelname `namelist'
capture label list `labelname'
if _rc {
di as err "no such value label defined"
exit 111
}
}
mata: lookitup("`labelname'", `j')
di as text `"`valuelabel'"'
return local valuelabel `"`valuelabel'"'
end
mata:
void lookitup (string scalar lblname, real scalar j) {
real colvector values
string colvector text
real scalar nlbl
string scalar labels
st_vlload(lblname, values = ., text = "")
nlbl = length(text)
if (nlbl == 1) labels = "label"
else if (nlbl > 1) labels = "labels"
if (nlbl < j) {
errprintf("no such label; %1.0f %s, but #%1.0f requested\n",
nlbl, labels, j)
exit(498)
}
else {
st_local("valuelabel", text[j])
}
}
end
一些例子:
. sysuse auto, clear
(1978 Automobile Data)
. jthvaluelabel foreign, j(1)
Domestic
. jthvaluelabel foreign, j(2)
Foreign
. jthvaluelabel foreign, j(3)
no such label; 2 labels, but #3 requested
r(498);
. jthvaluelabel make, j(1)
no value label attached to make
r(111);
. jthvaluelabel origin, j(1) labelname
Domestic
此处发布代码偶尔会有点困难。代码分隔符并不总是受到尊重。我的机器上的真实程序比上面的版本更加系统地缩进。
答案 2 :(得分:2)
我拼凑了Nick和Dimitriy的答案和评论的一个很好的解决方案(该应用程序用于输出一行表格的函数,在一个部分中,用户指定他们想要groupvar
的标签职位index
):
local labelname : value label `groupvar'
mata: st_vlload("`labelname'", values = ., text = "")
mata: st_local("vallab", text[`index'])
local vallab = substr("`vallab'",1,8)
然后程序继续使用本地vallab
。
答案 3 :(得分:1)
您可以使用您在问题中使用的宏扩展功能来执行此操作。
使用您自己的示例:
. clear
. set obs 3
number of observations (_N) was 0, now 3
. generate x = _n - 1
. label define xlab 0 "Something" 1 "Something else" 2 "Yet another thing"
. label value x xlab
您只需要事先指示Stata获取值标签中使用的最小值并添加一个位置。如您所见,可以使用label list
:
. quietly label list `: value label x'
. display "`: label (x) `= r(min) + 1', strict'"
Something else
在这种特殊情况下,即使没有label list
,您也可以在一行中实现:
. display "`: label (x) `= + 1', strict'"
Something else