首先,Stata 中的一条规则是字符串变量不能有值标签。只有数值变量可以有值标签。本质上,您想要的值标签已经在您的字符串变量中作为字符串值。所以,问题的关键在于您需要创建一个数值变量,其值按正确的顺序排列。
让我们以最简单的形式解决这个问题:字符串值只出现一次。所以
gen long order = _n
labmask order, values(var)
然后解决了这个问题,因为数值 1、2、... 与字符串值 zoo、abc 相关联,它们成为值标签。顺便说一句,我的一个labmask 的更好参考是
http://www.stata-journal.com/sjpdf.html?articlenum=gr0034
现在让我们把它变得更复杂。字符串值可能出现一次或多次,但我们希望数字变量尊重数据中的第一次出现。
gen long order1 = _n
egen order2 = min(order1), by(var)
egen order = group(order2)
labmask order, values(var)
这就是它的工作原理。
gen long order1 = _n
将观测值 1、2 放入一个新变量中。
egen order2 = min(order1), by(var)
查找var 的每个不同值的第一次出现。
egen order = group(order2)
将这些数字映射到 1、2 等等。
labmask order, values(var)
链接order的数值和var的字符串值,成为它的值标签。
这是一个在实践中如何运作的示例。
. l, sep(0)
+---------------------------------+
| var order1 order2 order |
|---------------------------------|
1. | zoo 1 1 zoo |
2. | abc 2 2 abc |
3. | zoo 3 1 zoo |
4. | abc 4 2 abc |
5. | new 5 5 new |
6. | newer 6 6 newer |
+---------------------------------+
. l, nola sep(0)
+---------------------------------+
| var order1 order2 order |
|---------------------------------|
1. | zoo 1 1 1 |
2. | abc 2 2 2 |
3. | zoo 3 1 1 |
4. | abc 4 2 2 |
5. | new 5 5 3 |
6. | newer 6 6 4 |
+---------------------------------+
一旦你得到正确的答案,你会drop order1 order2。
另一种解决方案请参见sencode。 (search sencode 查找参考资料和下载位置。)