我不是一个统计人员,但必须处理相当多的数据。在大多数情况下,这些数据集来自在线调查;因此我有一个MySQL数据库,知道如何从中得到一些结果。
但是,现在我收到了一个Stata文件,我需要做一些分析。在MySQL中,我知道如何做到这一点,但我被困在Stata并寻求你的帮助。
我有一个不太小的表(大约50k行),包含以下列(有更多cols,但这些是我必须使用的):
id - 对象ID,唯一值
name - 对象名称,字符串值
class - 对象类,整数范围1 - 6
origin - 对象的来源,整数范围1 - 2
在50k行中,只有大约7k个不同的名称。在Stata中,我可以使用list name
检索所有名称,甚至可以将其限制为list name if class == 2
的单个班级。
现在我想要一个包含所有不同名称的列表,以及具有该名称的对象的数量,并使列表按计数排序。
在MySQL中,我查询SELECT name, COUNT(*) AS cnt FROM objects GROUP BY name ORDER BY cnt DESC
。 但是如何在Stata中完成?
接下来的步骤是为每个类或两个来源获取这样的列表,即SELECT name, COUNT(*) AS cnt FROM objects WHERE class = 2 GROUP BY name ORDER BY cnt DESC
,这也是Stata的可能吗?
ps:我不知道stackoverflow是否是正确的地方,因为Stata不是真正的编程语言,是吗?但我在这里找到了一些与Stata有关的问题;这就是我在这里发布的原因。如果有更好的地方,请指出我在正确的地方。
答案 0 :(得分:2)
请记住,Stata仅适用于固定长度的矩形表,因此您只能添加跨越整个50k行的列。在此设置中,您可以这样做。
对于第一个问题(名称和频率列表),您可以
collapse (count) freq = name, by(class)
sort class freq name
list class name freq, sepby(class)
请注意,collapse
将删除现有数据并替换为摘要。 (通常,我讨厌这个数据管理方面的命令,但它应该在这里工作。)如果你不希望这种情况发生,这里有一个更复杂的技巧:
bysort class name : generate long freq = _N
bysort class name : generate byte first = (_n==1)
sort class freq name
list class name freq if first, sepby(class)
(说明:_N
是by
- 组中的观察次数,_n
是by
- 组中当前观察的次数。)< / p>
然后,您可以使用if class==#
将其子集化为感兴趣的类,如您所知。
答案 1 :(得分:0)
还可以使用groups
查看可下载的ssc inst groups
命令。