2017-10-10 9 views
0

J'ai une variable appelée Category qui spécifie la catégorie d'observations. Le problème est que certaines observations ont plusieurs catégories. Par exemple:Compter le nombre de chaînes distinctes et leur occurrence dans une variable

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

Il n'y a aucune signification dans l'ordre des catégories. Ils sont toujours séparés par ";". Il y a 250 catégories, donc la création de variables factices peut être difficile. J'ai la liste complète des catégories dans un fichier Excel séparé si cela peut aider. Ce que je veux, c'est simplement résumer mon ensemble de données par des catégories uniques comme Économie (3), Psychologie (2), Biologie (1) (donc la somme de tous peut être supérieure au nombre d'observations).

Répondre

1

tabsplit du package tab_chi sur SSC le fera pour vous.

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 

Remarque: Vous pouvez compter les points-virgules et ainsi les phrases comme celle-ci.

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

La logique est que vous mesurez la longueur de la chaîne et sa longueur doit des points-virgules ; remplacé par des chaînes vides (à savoir, enlevé). La différence est le nombre de points-virgules auxquels vous ajoutez 1.

EDIT: Comment accéder à une structure de données différente, en commençant par l'exemple de données ci-dessus.

. 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

Merci, cela a fonctionné parfaitement. Ce paquet sera certainement utile. Un petit problème peut-être est que la commande tabsplit n'accepte pas 'par tri'. Une idée de comment je pourrais procéder si je voulais appliquer tabsplit au sous-groupe? – Homard

+0

Voir la réponse révisée. Vouloir le faire à plusieurs reprises est une indication claire que vous avez besoin d'une version différente de l'ensemble de données ainsi que le présent. –