Создание переменной, которая увеличивается на единицу, если новое значение найдено в другом - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующая (отсортированная) переменная:

35 
35     
37 
37 
37 
40 

Я хочу создать новую переменную, которая будет увеличиваться на единицу при появлении нового числа в исходной переменной.

Например:

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

Я думал об использовании команд by или bysort, но ни одна из них, похоже, не решает проблему. Это похоже на то, что нужно многим, но я не смог найти ответ.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

@ Ник опередил меня на пару минут, но вот еще один способ сделать это:

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 возвращает целые числа от 1 до в соответствии с различными группами varlist в отсортированном порядке. Целые числа помечаются значениями 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 |
     +---------------+
0 голосов
/ 02 июля 2018

Вы просто подсчитываете, как часто значение отличается от предыдущего значения. Это работает также для наблюдения 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 или false (здесь, если два значения неравны) оцениваются как 1, если true и 0 - false.

...