2016-05-12 2 views
0

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

**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-код эго:

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

Но я не знаю, как в соответствии с другими наблюдениями с их идентификационным кодом.

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

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

ответ

1

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

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

Уважаемый Димитрий. Большое вам спасибо за вашу помощь. Поскольку у меня есть субъекты с тем же именем в моем списке, я получаю ошибку ** «Id-код уникален в пределах эго, есть несколько наблюдений с различным кодом id внутри эго». ** Поэтому я хотел бы указать для запуска вашей команды для каждого офиса (вы можете увидеть офис переменной в первой таблице). В офисах у меня нет двойных имен. Я пробовал с 'bys office:', но vlookup не принимает команду 'by'. – Amedeo

+0

@Amedeo Это ключевая деталь, которая не упоминается в вашем исходном вопросе. Решение состоит в том, чтобы переопределить то, что должно быть офицером. –

+0

Прошу прощения, я подумал, что это ясно, поскольку в таблице есть переменная, и я сказал, что изменения происходят из того же офиса. Виноват. Более того, я не знал, что vlookup не принимает по команде, спасибо за вашу помощь Dimitriy – Amedeo

1

Для сопоставления значений других наблюдений, типичный подход в 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) 
Смежные вопросы