首页 > 解决方案 > 如果在另一个变量中找到新值,则创建一个递增 1 的变量

问题描述

我有以下(排序的)变量:

35 
35     
37 
37 
37 
40 

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

例如:

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

我考虑过使用byorbysort命令,但似乎没有一个能解决问题。这看起来像很多人需要的东西,但我找不到答案。

标签: stata

解决方案


@Nick 让我领先了几分钟,但这是另一种更清洁的方法:

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 的值或值标签(如果存在)进行标记...”

使用没有缺失值的示例:

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 |
     +---------------+

推荐阅读