Пустышка равна 1, если имеет ту же запись, что и в другой строке - PullRequest
1 голос
/ 11 февраля 2020

У меня есть набор данных по истории занятости, который выглядит следующим образом:

Year    PersonID    Company
2010      a            1
2010      b            1
2010      c            2
2010      d            3
2010      e            1
2011      a            2
2011      b            1
2011      c            2
2011      d            3
2011      e            1

Я хочу создать переменную, равную 1, если человек находится в той же компании, что и Person a. Обратите внимание, Person a может изменить работу с течением времени.

Результат выглядит следующим образом:

Year    PersonID    Company     SameAsA
2010      a            1          1
2010      b            1          1
2010      c            2          0
2010      d            3          0
2010      e            1          1
2011      a            2          1
2011      b            1          0
2011      c            2          1
2011      d            3          0
2011      e            1          0

Как мне сгенерировать переменную "SameAsA"?

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы хотите, чтобы переменная индикатора для a находилась в компании в данное время. Подход @Cybernike можно описать следующим образом:

clear
input Year  str3 PersonID   Company
2010    a   1
2010    b   1
2010    c   2
2010    d   3
2010    e   1
2011    a   2
2011    b   1
2011    c   2
2011    d   3
2011    e   1
end

bysort Year Company : egen wanted = max(PersonID == "a") 

list, sepby(Year Company) 

     +------------------------------------+
     | Year   PersonID   Company   wanted |
     |------------------------------------|
  1. | 2010          e         1        1 |
  2. | 2010          a         1        1 |
  3. | 2010          b         1        1 |
     |------------------------------------|
  4. | 2010          c         2        0 |
     |------------------------------------|
  5. | 2010          d         3        0 |
     |------------------------------------|
  6. | 2011          e         1        0 |
  7. | 2011          b         1        0 |
     |------------------------------------|
  8. | 2011          c         2        1 |
  9. | 2011          a         2        1 |
     |------------------------------------|
 10. | 2011          d         3        0 |
     +------------------------------------+

Для получения дополнительной информации см. этот FAQ и этот обзор учебника .

1 голос
/ 11 февраля 2020

Не очень элегантно, но следующее, кажется, достигнет того, что вы ищете.

clear
input Year  str3 PersonID   Company
2010    a   1
2010    b   1
2010    c   2
2010    d   3
2010    e   1
2011    a   2
2011    b   1
2011    c   2
2011    d   3
2011    e   1
end

bysort Year: gen company_a = Company if PersonID == "a"
bysort Year: egen max = max(company_a)

gen     SameAsA = 0
replace SameAsA = 1 if Company == max

drop tempvar max

list

     +-------------------------------------+
     | Year   PersonID   Company   SameAsA |
     |-------------------------------------|
  1. | 2010          a         1         1 |
  2. | 2010          b         1         1 |
  3. | 2010          c         2         0 |
  4. | 2010          d         3         0 |
  5. | 2010          e         1         1 |
     |-------------------------------------|
  6. | 2011          a         2         1 |
  7. | 2011          b         1         0 |
  8. | 2011          c         2         1 |
  9. | 2011          d         3         0 |
 10. | 2011          e         1         0 |
     +-------------------------------------+
...