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

Stata 如何通过索引标签位置返回值标签,stata,Stata,假设我有一个名为MyVar的变量,其值标签定义如下: 0 Something 1 Something else 2 Yet another thing 如何获得第二个值标签,即其他内容?编辑:假设我事先不知道因子值是什么,即我不知道最小值标签,并且因子值可能以1以外的数字递增,并且可能不均匀递增 我知道我可以获得与值2对应的标签: 但我想获得值标签列表中2位置对应的标签: . <Some amazing Stata-fu using (labeled) variable MyVar

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