График только топ-имена с точки зрения частоты в гистограмме - PullRequest
1 голос
/ 11 марта 2019

Рассмотрим следующий набор игрушечных данных:

clear

input group str10 name n
1     "Jenny"   1
1     "Jenny"   1
1     "Ben"     1
1     "Tiffany" 1
1     "Sun"     1
2     "Jenny"   1
2     "Sun"     1
2     "Tiffany" 1
2     "S"       1
2     "T"       1
2     "R"       1
2     "Y"       1
2     "U"       1
2     "I"       1
2     "E"       1
2     "A"       1
2     "B"       1
3     "U"       1
3     "I"       1
3     "E"       1
3     "A"       1
3     "B"       1
end

Мой код следующий:

gen n=1
graph hbar (count) n, over(name, sort(1)) over(group)

Здесь отображаются все перемешанные имена, если я использую вышеупомянутые данные:

enter image description here

Как я могу создать гистограмму, которая показывает только 10 лучших категорий по частоте, определенной отдельно для каждого отдельного значения group?

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

Вот немного измененный пример:

clear
input group str50 name n
1     "Jenny"   1
1     "Jenny"   1
1     "Ben"     1
1     "Tiffany" 1
1     "Jenny"   1
1     "Sun"     1
2     "Jenny"   1
2     "Sun"     1
2     "Sun"     1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "Tiffany" 1
2     "S"       1
2     "T"       1
2     "R"       1
2     "Y"       1
2     "U"       1
2     "I"       1
2     "E"       1
2     "A"       1
2     "B"       1
3     "U"       1
3     "Ramon"   1
3     "Ramon"   1
3     "Ramon"   1
3     "Ramon"   1
3     "I"       1
3     "I"       1
3     "I"       1
3     "E"       1
3     "A"       1
3     "B"       1
end

Вы можете сначала collapse ваш набор данных:

collapse (count) n, by(group name)

Затем вы можете контролировать количество нарисованных имен, регулируя порог частоты следующим образом:

gsort group -n
bysort group: generate tag = _n < 3

graph hbar (asis) n if tag, over(name) over(group) nofill

enter image description here

2 голосов
/ 11 марта 2019

Чтобы проиллюстрировать выбор из 10 наиболее часто используемых классов, мы построим здесь набор данных с 2 группами. В каждом есть 11 классов. Затем мы показываем общий метод, чтобы выбрать 10 наиболее часто.

* create sandbox dataset 
clear 
set obs 22 
tokenize "`c(ALPHA)'" 
generate name = "" 
generate freq = _n 
generate group = cond(_n <= 11, 1, 2) 
forval j = 1/11 { 
      replace name = "``j''" if inlist(_n, `j', 23 - `j') 
}  

tabulate name group [fw=freq] 
expand freq 
drop freq 

Вот как выглядит набор данных (результаты команды tabulate выше):

           |         group
      name |         1          2 |     Total
-----------+----------------------+----------
         A |         1         22 |        23 
         B |         2         21 |        23 
         C |         3         20 |        23 
         D |         4         19 |        23 
         E |         5         18 |        23 
         F |         6         17 |        23 
         G |         7         16 |        23 
         H |         8         15 |        23 
         I |         9         14 |        23 
         J |        10         13 |        23 
         K |        11         12 |        23 
-----------+----------------------+----------
     Total |        66        187 |       253 

Десять самых распространенных классов - это K, J, ..., C, B для группы 1 и A, ..., J для группы 2.

Вот один из способов получения и составления графика 10 самых частых, определяемых отдельно для каждой группы. Код пользователя начинается здесь, с другим номером пользователя вместо 10, если это необходимо. Ничто в этом случае не зависит от наличия только двух групп, как в примере.

bysort group name : generate freq = _N
egen tag = tag(group name)
gsort group -tag -freq name
by group: generate selected = _n <= 10
bysort group name (selected) : replace selected = selected[_N]

graph hbar (count) if selected, over(name, sort(1) descending) by(group) nofill scheme(s1color)

enter image description here

...