代码之家  ›  专栏  ›  技术社区  ›  user42459

创建一个变量,如果在另一个变量中发现新值,则该变量将递增一个

  •  0
  • user42459  · 技术社区  · 6 年前

    我有以下(排序)变量:

    35 
    35     
    37 
    37 
    37 
    40 
    

    我想创建一个新变量,当原始变量中出现一个新的数字时,这个变量将增加一个。

    例如:

    35    1
    35    1    
    37    2
    37    2
    37    2
    40    3
    

    我想用 by bysort 但似乎没有一个命令能解决这个问题。这看起来是很多人需要的,但我找不到答案。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Nick Cox    6 年前

    您只是在计算一个值与上一个值的差异频率。这也适用于观察1,因为对观察0值的任何引用都返回为missing,所以在您的示例中35不等于missing。

    clear
    input x 
    35 
    35     
    37 
    37 
    37 
    40 
    end 
    
    gen new = sum(x != x[_n-1]) 
    list, sepby(new) 
    
         +----------+
         |  x   new |
         |----------|
      1. | 35     1 |
      2. | 35     1 |
         |----------|
      3. | 37     2 |
      4. | 37     2 |
      5. | 37     2 |
         |----------|
      6. | 40     3 |
         +----------+
    

    by 如果你有单独处理的观察数据块,这是很有意义的。这里的一个基本原则是,如果true和0为false,则将true或false比较(这里是两个值是否不等)计算为1。

        2
  •  1
  •   Pearly Spencer Paul Cruz    6 年前

    @尼克比我快了几分钟,但这里有另一种更清洁的方法:

    clear
    
    input foo
    35 
    35     
    37 
    37 
    37 
    40
    end
    
    egen counter = group(foo)
    
    list
    
         +---------------+
         | foo   counter |
         |---------------|
      1. |  35         1 |
      2. |  35         1 |
      3. |  37         2 |
      4. |  37         2 |
      5. |  37         2 |
         |---------------|
      6. |  40         3 |
         +---------------+
    

    这种方法使用 egen 命令及其关联 group() 功能。

    这个函数还有两个选项 missing 也许是最有用的。

    从命令的帮助文件:

    “…missing表示varlist中缺少值(或者。或“”)将被视为分配组时的任何其他值,而不是将缺少的值分配给缺少的组…

    clear
    
    input foo
    35 
    35
    .     
    37 
    37 
    37 
    40
    .
    end
    
    egen counter = group(foo), missing
    
    sort foo
    list
    
         +---------------+
         | foo   counter |
         |---------------|
      1. |  35         1 |
      2. |  35         1 |
      3. |  37         2 |
      4. |  37         2 |
      5. |  37         2 |
         |---------------|
      6. |  40         3 |
      7. |   .         4 |
      8. |   .         4 |
         +---------------+
    

    而不是:

    drop counter
    egen counter = group(foo)
    
    sort foo
    list
    
         +---------------+
         | foo   counter |
         |---------------|
      1. |  35         1 |
      2. |  35         1 |
      3. |  37         2 |
      4. |  37         2 |
      5. |  37         2 |
         |---------------|
      6. |  40         3 |
      7. |   .         . |
      8. |   .         . |
         +---------------+
    

    另一个选择是 label 以下内容:

    “……label选项根据varlist的不同组按排序顺序返回从1到上的整数。整数用varlist或value labels的值标记,如果它们存在…“

    使用不缺少值的示例:

    egen counter = group(foo), label
    
    list
    
         +---------------+
         | foo   counter |
         |---------------|
      1. |  35        35 |
      2. |  35        35 |
      3. |  37        37 |
      4. |  37        37 |
      5. |  37        37 |
         |---------------|
      6. |  40        40 |
         +---------------+