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.

现在我想要一个所有不同名称的列表以及具有该名称的对象的数量,并让列表按 count 排序。在 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相关的问题;这就是为什么我把它贴在这里。如果有更好的地方这样做,请指出我正确的地方。

4

2 回答 2

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是 -group 中的观察数by,并且_n是 -group 内的当前观察数by。)

然后,您可以使用 将其子集到感兴趣的类中if class==#,正如您已经知道的那样。

于 2011-09-01T19:08:21.783 回答
0

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

于 2013-07-06T09:27:39.633 回答