如何通过索引标签位置返回值标签

时间:2014-10-07 16:25:43

标签: stata

假设我有一个名为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

4 个答案:

答案 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