4

我在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。

你能指出我解决这个问题的方法吗?

4

6 回答 6

7

以下对我有用:

bysort group_id: egen desired_rank=rank(var_to_rank)

在此处输入图像描述

于 2011-05-18T11:40:15.377 回答
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)

似乎解决了这个问题。

于 2011-05-18T13:41:19.027 回答
5

为了更好地理解,我会说这个问题是错误的。目的是对观察结果进行分组,那些具有最低值的都被分配为 1 级,次低的都被分配到 2 级,依此类推。在我所看到的讨论中,这并不是大多数意义上的排名,但 Stataegen, rank()确实让你成为其中的一部分。

但是,在该线程(从此处开始)中引用的Statalist线程中提到的直接方法在精神上比引用的任何解决方案都简单:

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 的人经常觉得奇怪的命令)。

利益声明:引用的国家主义线程表明,当被问到类似的问题时,我也没有想到这个解决方案。

于 2013-01-05T13:00:49.083 回答
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
于 2013-01-04T20:42:53.730 回答
0

工作量太大了。轻松优雅。试试这个。

生成期望排名=int(var_to_rank/10)

于 2013-08-29T11:29:37.240 回答
0

试试这个命令,它对我很有效:egen newid=group(oldid)

于 2014-01-14T07:57:09.043 回答