我有以下(已排序)变量:
35
35
37
37
37
40
我想创建一个新变量,当原始变量中出现一个新数字时,该变量将增加一个。
例如:
35 1
35 1
37 2
37 2
37 2
40 3
我曾考虑使用by
或bysort
命令,但似乎都无法解决问题。这看起来像很多人需要的东西,但我找不到答案。
答案 0 :(得分:2)
您只是在计算一个值与以前的值相隔多久。这对于观察1也有效,因为对观察0的值的任何引用都以丢失的形式返回,因此在您的示例中35不等于丢失。
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,则将true或false比较(此处,两个值是否相等)评估为1,将false评估为0。
答案 1 :(得分:1)
@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
可能是最有用的。
从命令的帮助文件中:
“ ...丢失表示分配组时,将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 |
+---------------+