2016-05-12 5 views
0

Ich arbeite an Netzwerkanalyse und ich habe eine Datenmenge, diePassende Nominierungen mit ihren Codes

**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 

so aussieht, wie Sie jeden Ego angefordert wurde, sehen können maximal drei Abspaltungen aus dem gleichen Büro zu benennen.

Ich möchte die ID-Codes mit ihren Namen anzupassen, um neue Variablen/Spalten so etwas wie dieses

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

bekomme ich schon wissen, wie die Variable ID-Code Ego zu bekommen:

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

Aber ich weiß nicht, wie die anderen Beobachtungen mit ihrem ID-Code entspricht.

Anregungen sind willkommen.

Danke, Amedeo

Antwort

1

Kevin Crow hat einen vlookup Klon, der dies sehr einfach macht:

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 

Nachtrag:

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

Sehr geehrte Dimitriy. Vielen Dank für deine Hilfe. Weil ich Fächer mit dem gleichen Namen in meiner Liste habe, bekomme ich den Fehler ** "Id-Code ist einzigartig innerhalb des Egos; gibt es mehrere Beobachtungen mit unterschiedlichem ID-Code innerhalb des Egos." ** Daher möchte ich angeben, dass Sie Ihren Befehl für jedes Büro ausführen (Sie können die Variable Office in der ersten Tabelle sehen). In Büros habe ich keine doppelten Namen. Ich habe versucht mit einem 'Bys-Office:' aber vlookup akzeptiert 'by' Befehl nicht. – Amedeo

+0

@Amedeo Das ist ein Schlüsseldetail, das in Ihrer ursprünglichen Frage nicht erwähnt wird. Die Lösung besteht darin, die Dinge neu zu definieren, um für den Offizier spezifisch zu sein. –

+0

Es tut mir leid, ich dachte, es sei klar, da es die Variable in der Tabelle gibt und ich sagte, dass die Änderungen aus demselben Büro stammen. Mein Fehler. Außerdem wusste ich nicht, dass vlookup den Befehl nicht akzeptiert, Danke für Ihre Hilfe Dimitriy – Amedeo

1

Um Werte aus anderen Beobachtungen überein, Der typische Ansatz in Stata besteht darin, merge zu verwenden . In einem ersten Schritt erstellen Sie eine Master-Liste mit verschiedenen Werten des Egos pro Büro. Dann gehen Sie zurück zu den Originaldaten und fusionieren jede Änderung mit den verschiedenen Office-Namen. Um die Zusammenführung durchzuführen, ist eine Umbenennung des Variablennamens erforderlich:

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)