Найти наиболее часто встречающееся слово в строковых переменных - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть строковая переменная с разными цветами:

gen cols="red green red red blue maroon green pink"

Я хочу найти, какой цвет в этом списке появляется чаще всего.

Я пробовал команду count, но это выдаетнеправильные результаты.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Существует команда, созданная сообществом, которая делает это в одном.tabsplit из tab_chi на SSC ​​предназначен для этой цели.

clear 

input strL (colors numbers) 
"red green red red blue maroon green pink" "87 45 65 87 98 12 90 43"
end

tabsplit colors, sort 

     colors |      Freq.     Percent        Cum.
------------+-----------------------------------
        red |          3       37.50       37.50
      green |          2       25.00       62.50
       blue |          1       12.50       75.00
     maroon |          1       12.50       87.50
       pink |          1       12.50      100.00
------------+-----------------------------------
      Total |          8      100.00


tabsplit numbers, sort 

    numbers |      Freq.     Percent        Cum.
------------+-----------------------------------
         87 |          2       25.00       25.00
         12 |          1       12.50       37.50
         43 |          1       12.50       50.00
         45 |          1       12.50       62.50
         65 |          1       12.50       75.00
         90 |          1       12.50       87.50
         98 |          1       12.50      100.00
------------+-----------------------------------
      Total |          8      100.00

. 

РЕДАКТИРОВАТЬ Как указано в справке, tabsplit допускает соответствующие параметры tabulate, в том числе для сохранения результатов.Однако это не особенно полезно, так как matrow() не будет работать для строковых переменных.Это не задокументировано напрямую, но следует из принципа, что матрицы Stata не могут содержать строки.matcell() работает здесь, но знание одних частот не особенно полезно.Общий принцип заключается в том, что для многих вопросов, включающих слова в строках, гораздо проще работать со структурой, содержащей отдельные слова в каждом значении строковой переменной.

0 голосов
/ 28 ноября 2018

Рассмотрим немного другой игрушечный пример для лучшей иллюстрации:

clear

input strL (colors numbers) 
"red green red red blue maroon green pink" "87 45 65 87 98 12 90 43"
end

list

     +--------------------------------------------------------------------+
     |                                   colors                   numbers |
     |--------------------------------------------------------------------|
  1. | red green red red blue maroon green pink   87 45 65 87 98 12 90 43 |
     +--------------------------------------------------------------------+

Сначала вы должны split свою строку в отдельных переменных и изменить данные в длинную форму с помощью команды reshape.Далее вы рассчитываете частоту каждого слова.Наконец, вы reshape возвращаетесь к широкой форме и объединяете свои переменные с помощью egen.

В коде:

split colors 
split numbers
drop colors numbers

generate _i = _n
reshape long colors numbers, i(_i) j(_j)
drop if missing(colors) | missing(numbers)

bysort _i colors : generate colors_frequency = _N
bysort _i numbers : generate numbers_frequency = _N
bysort _i (colors_frequency) : generate fcolors = colors[_N]
bysort _i (numbers_frequency) : generate fnumbers = numbers[_N]

drop colors_frequency numbers_frequency
reshape wide colors numbers, i(_i) j(_j)

egen new_colors = concat(colors*), punct(" ")
egen new_numbers = concat(numbers*), punct(" ")

drop _i colors* numbers*
rename (new_colors new_numbers) (colors numbers)

Приведенный выше фрагмент даст желаемый результат:

list fcolors fnumbers

     +--------------------+
     | fcolors   fnumbers |
     |--------------------|
  1. |     red         87 |
     +--------------------+
...