Stata 如何通过索引标签位置返回值标签
假设我有一个名为MyVar的变量,其值标签定义如下:Stata 如何通过索引标签位置返回值标签,stata,Stata,假设我有一个名为MyVar的变量,其值标签定义如下: 0 Something 1 Something else 2 Yet another thing 如何获得第二个值标签,即其他内容?编辑:假设我事先不知道因子值是什么,即我不知道最小值标签,并且因子值可能以1以外的数字递增,并且可能不均匀递增 我知道我可以获得与值2对应的标签: 但我想获得值标签列表中2位置对应的标签: . <Some amazing Stata-fu using (labeled) variable MyVar
0 Something
1 Something else
2 Yet another thing
如何获得第二个值标签,即其他内容?编辑:假设我事先不知道因子值是什么,即我不知道最小值标签,并且因子值可能以1以外的数字递增,并且可能不均匀递增
我知道我可以获得与值2对应的标签:
但我想获得值标签列表中2位置对应的标签:
. <Some amazing Stata-fu using (labeled) variable MyVar and the position 2>
. di "`LABEL'"
Something else
您想要嵌套两个类似的:
从最后一行的末尾到前面工作。levelsof生成的本地Xnumber包含从最小到最大的不同级别的x:0 1 2。然后你计算出第二个单词是local,它是1。最后,您将获得与该数值对应的标签,这是另一种情况。您可以将标签放入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
在这里发布代码有时有点困难。代码分隔符并不总是受到尊重。我机器上的实际程序缩进比上面的版本更系统 我根据Nick和Dimitry的答案和评论拼凑出了一个很好的解决方案。该应用程序用于一个函数,在一个部分中输出一行表,用户指定他们想要位置索引的groupvar标签:
然后程序继续使用本地vallab。当且仅当所有前j个值都有标签时,第j个值的标签就是第j个值标签。@NickCox这是一个公平点。我经常有一些数字变量,上面的编码值被标记为x+或>=x,这是唯一的标签。迪米特里,你怎么知道x的值标签是xlab?抱歉没有澄清。。。我已经编辑了我先前的问题。如果您想选择某个人交给您的程序的变量的值标签的第二个位置,该怎么办。。。i、 你不是;我不确定是否有值标签或not@Alexis我可能会使用来自labutils套件的Cox博士的labvalclone来克隆所有变量的值标签,并用克隆来标记变量。那我就肯定知道这个名字了。我通常喜欢标签与变量同名。一个不那么严厉的选择是使用Daniel Klein的labellist。Nick,我怎么知道MyVar有标签来源?请看我修改后的问题,以及我先前缺乏明确性的任命;这只是自动数据集中的一组值标签。这将是一种非常好的方法,可以将一些代码构建到更大的程序中,尽管没有检查,因此如果假设是错误的,可能会出现一些不优雅的错误消息。请注意,在访问text[]的特定元素时不需要列下标,而text[]无论如何都是列向量。@NickCox您的检查是正确的。在应用程序的其他地方有隐式检查,但这是一个脆弱性。此外,我还编辑了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
*! 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
local labelname : value label `groupvar'
mata: st_vlload("`labelname'", values = ., text = "")
mata: st_local("vallab", text[`index'])
local vallab = substr("`vallab'",1,8)