Сопоставление номинаций с их кодами

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

**ID-code | ego  |  alter1  |alter2 |alter3 |Office**
100       | JHON |  ROCKY   |JOE    |MOLLY  |   1
101       |ROCKY |  JOE     |MOLLY  |JHON   |   1
102       | JOE  |  MOLLY   |JHON   |  .    |   1
103       | MOLLY|  ROCKY   | .     |  .    |   1 

Как видите, каждому эго было предложено назвать не более трех альтеров из одного офиса.

Я хотел бы сопоставить ID-коды с их именами, чтобы получить новые переменные/столбцы примерно так

   **ID-code ego|   ID_alter1   |ID_alter2  |ID_alter3**
    100JHON     |    101ROCKY   |102JOE     |103MOLLY
    101ROCKY    |    102JOE     |103MOLLY   |100JHON
    102JOE      |    103MOLLY   |100JHON    |    .
    103MOLLY    |    101ROCKY   |  .        |    .

Я уже знаю, как получить переменную ID-code ego:

*egen ID-code ego= concat (ID-code ego)*

Но я не знаю, как сопоставить другие наблюдения с их ID-кодом.

любые предложения приветствуются.

Спасибо, Амедео


person Amedeo    schedule 12.05.2016    source источник


Ответы (2)


Кевин Кроу написал клон vlookup, который делает это очень легко:

clear
input int id_code str5 ego str5 alter1 str5 alter2 str5 alter3
100 "JOHN" "ROCKY" "JOE" "MOLLY"
101 "ROCKY" "JOE" "MOLLY" "JOHN"
102 "JOE" "MOLLY" "JOHN" ""
103 "MOLLY" "ROCKY" "" ""
end
capture net install vlookup, from(http://www.stata.com/users/kcrow)
gen id_code_ego = string(id) + ego
forvalues i=1/3 {
    vlookup alter`i', gen(code) key(ego) value(id_code)
    gen id_alter`i' = string(code) + alter`i'
    drop alter`i' code
}
drop id_code ego

Приложение:

clear
input int id_code str5 ego str5 alter1 str5 alter2 str5 alter3 int officer
100 "JOHN" "ROCKY" "JOE" "MOLLY" 1
101 "ROCKY" "JOE" "MOLLY" "JOHN" 1
102 "JOE" "MOLLY" "JOHN" "" 1
103 "MOLLY" "ROCKY" "" "" 1
103 "JOHN" "ROCKY" "JOE" "MOLLY" 2
102 "ROCKY" "JOE" "MOLLY" "JOHN" 2
101 "JOE" "MOLLY" "JOHN" "" 2
100 "MOLLY" "ROCKY" "" "" 2
end
capture net install vlookup, from(http://www.stata.com/users/kcrow)

gen id_code_ego_officer = string(id) + ego + string(officer)
gen ego_officer = ego + string(office)

forvalues i=1/3 {
    replace alter`i'= alter`i' + string(officer) 
    vlookup alter`i', gen(code) key(ego_officer) value(id_code)
    gen id_alter`i' = string(code) + alter`i'
    replace id_alter`i' = regexr(id_alter`i',"[0-9]?$","")
    drop alter`i' code  
}

drop id_code_ego_officer ego_officer
person Dimitriy V. Masterov    schedule 13.05.2016
comment
Уважаемый Дмитрий. Большое вам спасибо за вашу помощь. Поскольку в моем списке есть предметы с таким же именем, я получаю сообщение об ошибке **Идентификационный код уникален в пределах эго; внутри эго есть несколько наблюдений с разным идентификационным кодом. **Поэтому я хотел бы указать, чтобы ваша команда выполнялась для каждого офиса (вы можете увидеть переменную office в первой таблице). В офисах у меня нет двойных имен. Я пробовал с bys office: , но vlookup не принимает команду by. - person Amedeo; 13.05.2016
comment
@Amedeo Это ключевая деталь, не упомянутая в вашем первоначальном вопросе. Решение состоит в том, чтобы переопределить вещи, чтобы они были специфичными для офицера. - person Dimitriy V. Masterov; 13.05.2016
comment
Извините, я думал, что это понятно, так как в таблице есть переменная, и я сказал, что альтеры из одной конторы. Виноват. Более того, я не знал, что vlookup не принимает команду by, спасибо за помощь, Дмитрий. - person Amedeo; 13.05.2016

Для сопоставления значений из других наблюдений типичным подходом в Stata является использование merge. На первом этапе вы создаете основной список различных значений эго для каждого офиса. Затем вы возвращаетесь к исходным данным и объединяете каждое изменение с отдельными именами офисов. Для выполнения слияния требуется некоторое переименование имени переменной:

clear
input int id_code str5 ego str5 alter1 str5 alter2 str5 alter3 int office
100 "JOHN" "ROCKY" "JOE" "MOLLY" 1
101 "ROCKY" "JOE" "MOLLY" "JOHN" 1
102 "JOE" "MOLLY" "JOHN" "" 1
103 "MOLLY" "ROCKY" "" "" 1
103 "JOHN" "ROCKY" "JOE" "MOLLY" 2
102 "ROCKY" "JOE" "MOLLY" "JOHN" 2
101 "JOE" "MOLLY" "JOHN" "" 2
100 "MOLLY" "ROCKY" "" "" 2
end

* make a master list of unique id/name per office
preserve
keep office id_code ego
isid office id_code ego, sort
rename (id_code ego) (id0 ego0)
save "match_egos.dta", replace
restore

* combine the id/ego for each observation
gen ID_ego = string(id_code) + ego

* loop over each alter and merge with the master list
forvalues i = 1/3 {
    clonevar ego0 = alter`i'
    merge m:1 office ego0 using "match_egos.dta", keep(master match) nogen
    gen ID_alter`i' = string(id0) + alter`i'
    drop ego0 id0
}

isid office id_code ego, sort
* leftalign is from SSC; to install, type in Command window: ssc install left align
leftalign
list ID_*, sepby(office)
person Robert Picard    schedule 13.05.2016