在字符串变量中查找最常见的单词

时间:2018-11-28 11:27:52

标签: stata

我有一个具有不同颜色的字符串变量:

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

我想找到此列表中最常出现的颜色。

我尝试了count命令,但这会产生错误的结果。

2 个答案:

答案 0 :(得分:2)

考虑一个稍有不同的玩具示例以更好地说明:

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 |
     +--------------------+

答案 1 :(得分:2)

有一个由社区提供的命令,可以一并执行。 SSC上tabsplit的{​​{1}}是为此目的而设计的。

tab_chi

EDIT如其帮助中所述,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不适用于字符串变量。这没有直接记录,但是遵循Stata矩阵不能容纳字符串的原理。 matrow()确实可以在这里工作,但是仅了解频率并不是特别有用。首要原则是,对于涉及字符串中单词的许多问题,在字符串变量的每个值中包含单个单词的结构更容易使用。