我在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
Run Code Online (Sandbox Code Playgroud)
我想根据一个变量(var_to_rank)在组(group_id)中创建每个观察的等级.通常,为此我用过:
gen id = _n
Run Code Online (Sandbox Code Playgroud)
但是我的一些观察结果(在我的小例子中group_id = 2)具有相同的排名变量值,这种方法不起作用.
我也试过用:
egen rank
Run Code Online (Sandbox Code Playgroud)
具有不同选项的命令,但不能使我的等级变量看起来像desired_rank.
你能指点我解决这个问题吗?
以下适用于我:
bysort group_id: egen desired_rank=rank(var_to_rank)
Run Code Online (Sandbox Code Playgroud)

在Statalist上偶然发现了这样的解决方案:
bysort group_id (var_to_rank) : gen rank = var_to_rank != var_to_rank[_n-1]
by group_id : replace rank = sum(rank)
Run Code Online (Sandbox Code Playgroud)
似乎解决了这个问题.
我想说这个问题是为了最好的理解而提出的错误方式。目的是对观察进行分组,具有最低值的那些都被指定为 1,次低的被全部指定为 2,依此类推。这并不是我所讨论过的大多数意义上的排名,但 Stataegen, rank()确实让您参与其中。
但是,在此线程中引用的 Statalist 线程(从此处开始)中提到的直接方式在精神上比引用的任何解决方案更简单:
bysort group_id (var_to_rank): gen desired_rank = sum(var_to_rank != var_to_rank[_n-1])
Run Code Online (Sandbox Code Playgroud)
一旦对数据进行排序,var_to_rank那么当值与每个不同值块开头的先前值不同时,值 1 是var_to_rank != var_to_rank[_n-1]; 否则 0 是结果。将这些 1 和 0 相加得到所需的变量。prefix 命令bysort执行所需的排序,并确保这一切都在由 定义的组内单独完成group_id。完全不需要egen(许多只使用 Stata 的人偶尔会觉得奇怪的命令)。
利益声明:引用的 Statalist 线程表明,当被问到类似的问题时,我也没有想到这个解决方案。
| 归档时间: |
|
| 查看次数: |
26010 次 |
| 最近记录: |