我有一个具有不同颜色的字符串变量:
gen cols="red green red red blue maroon green pink"
我想找到此列表中最常出现的颜色。
我尝试了count
命令,但这会产生错误的结果。
答案 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()
确实可以在这里工作,但是仅了解频率并不是特别有用。首要原则是,对于涉及字符串中单词的许多问题,在字符串变量的每个值中包含单个单词的结构更容易使用。