【问题标题】:Encode a string variable in non-alphanumeric order以非字母数字顺序编码字符串变量
【发布时间】:2013-12-05 15:43:45
【问题描述】:

我想encode 一个字符串变量,其分配的数字代码尊重字符串值的原始顺序(如使用browse 时所示)。为什么?使用reshape wide 时,我需要编码变量标签来获取正确的变量名称。

假设var 是一个没有标签的字符串变量:

var      label(var)  
"zoo"    none  
"abc"    none

如果你开始:

编码 var, gen(var2)

标签是 1="abc" 2="zoo" 可以看到

标签李

但我希望标签按时排序,如browse 中所示,以后变量的顺序保持不变。

我没有找到encode 选项,其中标签按我在使用browse 时看到的顺序添加。

我最好的想法是手工完成:

ssc 安装 labutil
labvalch var, f(1 2) t(2 1)

这很好,但我有 >50 个列表条目。

其他方法:使用reshape 时使用另一个命令,但我认为这不起作用。

重塑宽 x, i(id) j(var)

我才发现

ssc 安装 labutil
labmask 区域代码,值(区域)

作为encode 的替代品,但我无法使用labmask 处理字符串。

【问题讨论】:

    标签: label encode stata


    【解决方案1】:

    首先,Stata 中的一条规则是字符串变量不能有值标签。只有数值变量可以有值标签。本质上,您想要的值标签已经在您的字符串变量中作为字符串值。所以,问题的关键在于您需要创建一个数值变量,其值按正确的顺序排列。

    让我们以最简单的形式解决这个问题:字符串值只出现一次。所以

    gen long order = _n 
    labmask order, values(var) 
    

    然后解决了这个问题,因为数值 1、2、... 与字符串值 zooabc 相关联,它们成为值标签。顺便说一句,我的一个labmask 的更好参考是 http://www.stata-journal.com/sjpdf.html?articlenum=gr0034

    现在让我们把它变得更复杂。字符串值可能出现一次或多次,但我们希望数字变量尊重数据中的第一次出现。

    gen long order1 = _n
    egen order2 = min(order1), by(var) 
    egen order = group(order2) 
    labmask order, values(var) 
    

    这就是它的工作原理。

    gen long order1 = _n 
    

    将观测值 1、2 放入一个新变量中。

    egen order2 = min(order1), by(var)
    

    查找var 的每个不同值的第一次出现。

    egen order = group(order2) 
    

    将这些数字映射到 1、2 等等。

    labmask order, values(var)
    

    链接order的数值和var的字符串值,成为它的值标签。

    这是一个在实践中如何运作的示例。

    . l, sep(0)
    
        +---------------------------------+
        |   var   order1   order2   order |
        |---------------------------------|
     1. |   zoo        1        1     zoo |
     2. |   abc        2        2     abc |
     3. |   zoo        3        1     zoo |
     4. |   abc        4        2     abc |
     5. |   new        5        5     new |
     6. | newer        6        6   newer |
        +---------------------------------+
    
    . l, nola sep(0)
    
        +---------------------------------+
        |   var   order1   order2   order |
        |---------------------------------|
     1. |   zoo        1        1       1 |
     2. |   abc        2        2       2 |
     3. |   zoo        3        1       1 |
     4. |   abc        4        2       2 |
     5. |   new        5        5       3 |
     6. | newer        6        6       4 |
        +---------------------------------+
    

    一旦你得到正确的答案,你会drop order1 order2

    另一种解决方案请参见sencode。 (search sencode 查找参考资料和下载位置。)

    【讨论】:

    • @DimitriyV.Masterov 我相信你是对的。我更容易使用我从内部和外部理解的命令,这里是labmask
    • 哦。我应该知道有简单的解决方案。 :) 感谢您指向labmask
    【解决方案2】:

    Roger Newson 的用户编写命令sencode(超级编码),以及运行ssc describe sencode 可用于您想要的。可以使用值在原始数据集中出现的顺序来分配它们,而不是根据字符串变量的字母数字顺序分配数字代码。

    clear all
    set more off
    
    *------- example data ---------
    
    input str10 var
    abc
    zoo
    zoo
    zoo
    elephant
    elephant
    abc
    abc
    elephant
    zoo
    end
    
    *------- encode ---------------
    
    encode var, generate(var2)
    sencode var, generate(var3)
    
    list, separator(0)
    list, separator(0) nolabel
    

    变量var3 是所需的形式。对比一下var2

    【讨论】:

      【解决方案3】:

      我不确定是否有一个优雅的解决方案,因为我认为levelsof 按字母顺序排列字符串。

      只要您的列表是唯一的,这应该可以工作。

      clear
      input str3 myVar 
      "zoo"
      "abc"
      "def"
      end
      
      * for reshape
      generate iVar = 1
      generate jVar = _n
      
      * reshape to wide
      reshape wide myVar, i(iVar) j(jVar)
      list
      
      * create label
      local i = 0
      foreach v of varlist myVar* {
          local ++i
          local myVarName = `v'
          label define myLabel `i' "`myVarName'", add
      }
      
      * reshape to wide
      reshape long myVar, i(iVar) j(myVarEncoded)
      
      * assign label
      label value myVarEncoded myLabel
      

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        相关资源
        最近更新 更多