如何在Stata中使用group by语句(来自MySQL)?

3
我不是一个统计学家,但必须处理相当数量的数据。在大多数情况下,这些数据集来自在线调查;因此我有一个MySQL数据库,并知道如何从中获取一些结果。
然而,现在我得到了一个Stata文件,需要进行一些分析。在MySQL中,我知道如何做到这一点,但我卡在了Stata上,请求您的帮助。
我有一个不太小的表(大约50k行),包含以下列(还有更多列,但这些是我要处理的):
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中是否也可以实现?
附:我不知道stackoverflow是否是正确的地方,因为Stata并不是真正的编程语言,对吗?但我在这里找到了一些与Stata相关的问题,所以我在这里发布了它。如果有更好的地方,请指点一下。

1
这个答案有帮助吗?http://stackoverflow.com/questions/6151020/how-to-aggregate-relational-data-in-stata - ypercubeᵀᴹ
这看起来绝对很有前途,但最终我要么得到成千上万个新变量,要么得到无法处理的数据集。我仍然会尝试适应这个方法。最终,我只需要将所有这些mX值相加即可。感谢您指向那个问题! - Paul
人们确实会问有关Stata的问题,但社区专业知识有些有限。对于Stata问题的首要解答站点是statalist (http://www.stata.com/statalist/)。 - StasK
2个回答

2

请记住,Stata只能处理固定长度的矩形表格,因此您只能添加跨越整个5万行的列。在这种设置中,您可以这样做:

对于第一个问题(名称和频率列表),您可以

   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 是按组观察值的数量,_n 是当前观察值在该组中的编号。)
然后,您可以使用 if class==# 将其子集化为所需的类别,因为您已经知道了。

谢谢StasK,这正是我想要的。 by(s)命令现在成为我的新朋友了。;) - Paul

0

还可以查看使用 ssc inst groups 命令可下载的 groups 命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接