如何在Stata中对组内的观察进行排名?

时间:2011-05-18 10:42:56

标签: stata

我在Stata中有一些数据看起来像前两列:

group_id   var_to_rank  desired_rank
____________________________________

1           10          1
1           20          2
1           30          3
1           40          4
2           10          1
2           20          2
2           20          2
2           30          3

我想根据一个变量(var_to_rank)在组(group_id)中创建每个观察的等级。通常,为此我使用了:

gen id = _n

然而,我的一些观察结果(在我的小例子中group_id = 2)具有相同的排名变量值,这种方法不起作用。

我也尝试过使用:

egen rank

命令有不同的选项,但不能使我的等级变量看起来像desired_rank。

你能指点我解决这个问题吗?

6 个答案:

答案 0 :(得分:7)

以下适用于我:

bysort group_id: egen desired_rank=rank(var_to_rank)

enter image description here

答案 1 :(得分:5)

Statalist

上偶然发现了这样的解决方案
bysort group_id (var_to_rank) : gen rank = var_to_rank != var_to_rank[_n-1]
by group_id : replace rank = sum(rank)

似乎要解决这个问题。

答案 2 :(得分:4)

我会说这个问题是错误的,以便最好地理解。目标是对观察进行分组,将具有最低值的那些全部分配为等级1,将下一个最低值分配为等级2,依此类推。这并不是我所见过的大多数意义上的排名,但Stata的egen, rank()确实可以帮助你解决问题。

但直接的方式,在Statalist线程中提到的这个帖子(start here)中引用的地方比任何引用的解决方案都简单明了:

bysort group_id (var_to_rank): gen desired_rank = sum(var_to_rank != var_to_rank[_n-1]) 

一旦数据在var_to_rank上排序,那么当值与每个不同值块的开头的先前值不同时,值为1是var_to_rank != var_to_rank[_n-1]的结果;否则为0。将这些1和0累加,得出所需的变量。前缀命令bysort执行所需的排序,并确保在group_id定义的组中单独完成此操作。根本不需要egen(许多只偶尔使用Stata的人经常发现奇怪的命令)。

感兴趣的声明:引用的Statalist主题表明,当被问到类似的问题时,我也没有想到这个解决方案。

答案 3 :(得分:3)

@radek:你肯定在此期间把它整理好了......但这可能是一个简单(虽然不是很优雅)的解决方案:

bysort group_id:   egen desired_rank_HELP =rank(var_to_rank), field
egen desired_rank      =group(grup_id desired_rank_HELP)
drop desired_rank_HELP

答案 4 :(得分:0)

方式太多了。轻松优雅。试试这个。

gen desired_rank = int(var_to_rank / 10)

答案 5 :(得分:0)

尝试此命令,它对我很有用:egen newid=group(oldid)