按字段对观察结果进行排序,在相等的排名后无跳跃(Stata)

按字段对观察结果进行排序,在相等的排名后无跳跃(Stata),stata,rank,Stata,Rank,我需要在Stata中生成一个秩变量。为此,我找到了函数 egen A = rank(B), field by (C) 适合。然而,问题是B中有相等的值。因此,该命令所做的是,为具有相同值的对象在A中提供相同的等级。在B中不相等的下一个观测值不会得到下一个数字,而是跳跃的步数与在B中相等的观测值一样多。在我的例子中,这种跳跃是不应该发生的。 小数据示例: | B C A D| 1. | 6.5 1 1 1| 2. | 5.5 1 2 2| 3. |

我需要在Stata中生成一个秩变量。为此,我找到了函数

egen A = rank(B), field by (C)
适合。然而,问题是B中有相等的值。因此,该命令所做的是,为具有相同值的对象在A中提供相同的等级。在B中不相等的下一个观测值不会得到下一个数字,而是跳跃的步数与在B中相等的观测值一样多。在我的例子中,这种跳跃是不应该发生的。 小数据示例:

    |   B   C   A  D|
 1. | 6.5   1   1  1|
 2. | 5.5   1   2  2|
 3. | 5.5   1   2  2|
 4. | 5.5   1   2  2|
 5. | 2.5   1   5  3|
 6. | 2.5   1   5  3|
 7. | 1.5   1   7  4|
 8. | 4.5   2   1  1|
 9. | 3.5   2   2  2|
10. | 3.5   2   2  2|
11. | 2.5   2   4  3|
12. | 1.5   2   5  4|
13. | 1.5   2   5  4|
14. | 1.5   2   5  4|
15. | 1.5   2   5  4|
16. | 1     2   5  5|
上面描述的命令给了我A,但我想得到D。有人建议如何得到D吗

数据:

说明:

如果变量D是C组中的第一条记录,或者如果C等于上一条记录的C,而B不等于上一条记录的B,则cond函数将值1赋给变量D。否则,变量D被赋值为0

replace命令将上一条记录的D值与实际记录的D值相加。按C:使计数重新开始,C的每一个新值为1


如果您一个接一个地运行这些命令并观察数据的变化,您将了解这些命令的作用。

欢迎使用堆栈溢出!请您编辑并详细说明一下您的答案,以解释它,而不仅仅是给出结果。以重复形式结束问题时,会提醒您可以通过对变量求反来颠倒排序顺序。否则,解决方案是通过排序C B:gen D=sumB!=B[_n-1]后跟C:replace D=D[_n]-D+1。谢谢,第二个给了我解决方案。仅仅否定变量并不能解决问题。很抱歉,如果同样的问题已经被问过了,我找不到。我不同意你关于否定的教条主义。gen negB=-B后跟端口C negB:gen D=sumnegB!=negB[_n-1]是另一种解决方案,我不这么认为。这不是故意的侮辱,我对你提供给我的解决方案非常满意。
input B C
1.5 1
2.5 1
2.5 1
5.5 1
5.5 1
5.5 1
6.5 1
1.5 2
1.5 2
1.5 2
1.5 2
2.5 2
3.5 2
3.5 2
4.5 2
end
clear
input B C
1.5 1
2.5 1
2.5 1
5.5 1
5.5 1
5.5 1
6.5 1
1.5 2
1.5 2
1.5 2
1.5 2
2.5 2
3.5 2
3.5 2
4.5 2
end

sort C B
by C: gen D = cond(_n == 1 | (C[_n-1]== C & B[_n-1] != B), 1, 0) 
by C: replace D = D[_n-1]+D if _n > 1