我在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。
你能指点我解决这个问题吗?
答案 0 :(得分:7)
以下适用于我:
bysort group_id: egen desired_rank=rank(var_to_rank)
答案 1 :(得分:5)
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)