2017-10-10 2 views
0

Ich habe eine Variable namens Category, die die Kategorie der Beobachtungen angibt. Das Problem ist, dass einige Beobachtungen mehrere Kategorien haben. Zum Beispiel:Zählen Sie die Anzahl der verschiedenen Strings und deren Auftreten in einer Variablen

id  Category 
    1  Economics 
    2  Biology 
    3  Psychology; Economics 
    4  Economics; Psychology 

Es gibt keine Bedeutung in der Reihenfolge der Kategorien. Sie sind immer durch ";" getrennt. Es gibt 250 Kategorien. Das Erstellen von Dummy-Variablen kann daher schwierig sein. Ich habe die vollständige Liste der Kategorien in einer separaten Excel-Datei, wenn dies helfen könnte.

Was ich will, ist einfach meinen Datensatz nach eindeutigen Kategorien wie Ökonomie (3), Psychologie (2), Biologie (1) zusammenzufassen (so dass die Summe aller der Anzahl der Beobachtungen überlegen sein kann).

Antwort

1

tabsplit aus dem tab_chi Paket auf SSC wird dies für Sie tun.

clear 
input id str42 Category 
    1  "Economics" 
    2  "Biology" 
    3  "Psychology; Economics" 
    4  "Economics; Psychology" 
end 

capture ssc install tab_chi 

tabsplit Category, p(;) 

    Category |  Freq.  Percent  Cum. 
------------+----------------------------------- 
    Biology |   1  16.67  16.67 
    Economics |   3  50.00  66.67 
Psychology |   2  33.33  100.00 
------------+----------------------------------- 
     Total |   6  100.00 

Hinweis: Sie können Semikolons und damit Sätze wie diese zählen.

gen count = 1 + length(category) - length(subinstr(category, ";", "", .)) 

Die Logik ist, dass Sie die Länge der Zeichenfolge und seine Länge sollte Semikolons durch leere Strings ; ersetzt messen (nämlich entfernt). Der Unterschied ist die Anzahl der Semikolons, die Sie hinzufügen 1.

EDIT: Wie Sie zu einer anderen Datenstruktur gelangen, beginnend mit dem Datenbeispiel oben.

. split Category, p(;) 
variables created as string: 
Category1 Category2 

. drop Category 

. reshape long Category, i(id) j(mention) 
(note: j = 1 2) 

Data        wide -> long 
----------------------------------------------------------------------------- 
Number of obs.      4 ->  8 
Number of variables     3 ->  3 
j variable (2 values)      -> mention 
xij variables: 
        Category1 Category2 -> Category 
----------------------------------------------------------------------------- 

. drop if missing(Category) 
(2 observations deleted) 

. list, sepby(id) 

    +----------------------------+ 
    | id mention  Category | 
    |----------------------------| 
    1. | 1   1  Economics | 
    |----------------------------| 
    2. | 2   1  Biology | 
    |----------------------------| 
    3. | 3   1 Psychology | 
    4. | 3   2  Economics | 
    |----------------------------| 
    5. | 4   1  Economics | 
    6. | 4   2 Psychology | 
    +----------------------------+ 
+0

Danke, es hat perfekt funktioniert. Dieses Paket wird sicherlich nützlich sein. Ein kleines Problem ist vielleicht, dass der Tabsplit-Befehl 'nach Sortierung' nicht akzeptiert. Irgendeine Idee, wie ich fortfahren könnte, wenn ich Tabsplit auf Untergruppe anwenden wollte? – Homard

+0

Siehe überarbeitete Antwort. Dies wiederholt zu tun, ist ein klares Zeichen dafür, dass Sie eine andere Version des Datasets als auch die Gegenwart benötigen. –

Verwandte Themen