2017-10-31 3 views
1

Ich spiele mit einer Übung der Textfindung in Stata.Suche nach Text in einer Zelle

clear 
input id postid str7 text str3 referencedtext ref_postid 
1 1 "XYZ ABC" "" . 
1 2 "BCD ABC" "ABC" 1 
1 3 "DCE" "" . 
2 1 "XYZ" "" . 
2 2 "ABC" "" . 
2 3 "JKL" "" . 
2 4 "JKL DEF" "JKL" 3 
end 

Ich versuche, was postid im selben Thread zu finden, dass referencedtext aus (das heißt, der ein Plakat Referenzierung gegeben ist) kommt, und erstellen Sie eine neue Variable ref_postid die postid die referenzierte Post bedeutet. Die referencedtext kann alle ursprünglichen text enthalten, auf die sie verweist, oder nur ein Stück. Es kann auch zu Unterschieden in der Kapitalisierung kommen, daher wäre es hilfreich, dies zu tun.

Dies ist, was ich verwendet:

gen ref_postid = . 
qui bys id (postid) : sum postid 
local postidmax= r(max) 
qui forval i = 1/`postidmax' { 
    bys id (postid): replace ref_postid = postid[_n-`i'] if referencedtext == text[_n-`i'] & referencedtext != "" & postid != 1 
} 
+0

@NickCox (1) und (2) waren Tippfehler, die jetzt behoben sind. (2) war ursprünglich kein Problem, aber ein Fehler ist aufgetreten, um Ihr Verständnis zu unterstützen. (3) ist ein Coding-Problem und ich bin offen für eine Lösung. (4) Weil, wie kann der ursprüngliche Beitrag in einem Thread etwas in einem Thread referenzieren, der nicht existiert? (logisch unmöglich). Der Text der Frage war von Anfang an klar und ich würde mir vorstellen, dass es ein gemeinsames Problem ist. – CJ12

+0

@NickCox Der "Text der Frage war von Anfang an klar" ist die Aussage, die ich gemacht habe. Ich habe keine solche Aussage über den Code gemacht. Ohne meinen Versuch (was offensichtlich nicht funktioniert), aber ich versuche immer meinen eigenen Versuch zu machen, steht die Frage klar. Wie für (2) ist 3 die richtige Antwort, weil 'id == 2 & postid == 4' 'referenzierter Text == JKL' hat, was nur innerhalb der 'id == 2' zu sehen ist, wenn 'postid == 3' – CJ12

+0

@NickCox Nun, das hin und her hat mir geholfen, die Antwort abzuleiten, also vielen Dank – CJ12

Antwort

0

Dank einigem Hin und Her mit Nick, funktioniert diese Lösung. Die Verwendung von strpos hilft, die Notwendigkeit einer genauen Übereinstimmung zu vermeiden, und das Reduzieren des Textes in Kleinbuchstaben ist hilfreich bei der Maximierung der Übereinstimmungen. Je nach Textlänge kann dies jedoch am besten durch eine exakte Übereinstimmungsanforderung ersetzt werden.

replace text = lower(text) 
replace referencedtext = lower(referencedtext) 
gen ref_postid = . 
qui su postid 
local maxposts = r(max) 
forval i = 1/`maxposts' { 
    qui bys id (postid) : replace ref_postid = postid[_n-`i'] if strpos(text[_n-`i'],referencedtext) >= 1 & postid != 1 & referencedtext != "" 
} 
0

Dies ist ein Versuch, die Antwort von @ CJ12 ohne Schleife neu zu schreiben. Es reproduziert die gewünschte Lösung. Ob es eine andere Annahme bricht, bleibt offen für einen Kommentar.

clear 
input id postid str7 text str3 referencedtext 
1 1 "XYZ ABC" "" 
1 2 "BCD ABC" "ABC" 
1 3 "DCE" "" 
2 1 "XYZ" "" 
2 2 "ABC" "" 
2 3 "JKL" "" 
2 4 "JKL DEF" "JKL" 
end 

gen text2 = lower(text) 
bysort id (referenced): gen refer2 = lower(referenced[_N]) 
gen found = strpos(text2, refer2) > 0 
gsort id -found postid 
by id: gen ref_postid = postid[1] if found 
replace ref_postid = . if missing(referenced) 
sort id postid 

list, sepby(id) 

    +------------------------------------------------------------------------+ 
    | id postid  text refere~t  text2 refer2 found ref_po~d | 
    |------------------------------------------------------------------------| 
    1. | 1  1 XYZ ABC    xyz abc  abc  1   . | 
    2. | 1  2 BCD ABC  ABC bcd abc  abc  1   1 | 
    3. | 1  3  DCE     dce  abc  0   . | 
    |------------------------------------------------------------------------| 
    4. | 2  1  XYZ     xyz  jkl  0   . | 
    5. | 2  2  ABC     abc  jkl  0   . | 
    6. | 2  3  JKL     jkl  jkl  1   . | 
    7. | 2  4 JKL DEF  JKL jkl def  jkl  1   3 | 
    +------------------------------------------------------------------------+ 
Verwandte Themen