1

这个问题似乎应该可以通过几行简单的代码轻松完成,但我还没有找到解决方法:

我想采取这样的措施:

 +---------------+
 | id        var |
 |               |
 |  1        112 |
 |  1        113 |
 |  2        221 |
 |  2        222 |
 |  3        331 |
 |---------------|
 |  3        332 |
 |  3        333 |
 +---------------+

并把它变成这样:

 +-------------------------------+
 | id   var   var1   var2   var3 |
 |-------------------------------|
 |  1   112    112      .      . |
 |  1   113      .    113      . |
 |  2   221    221      .      . |
 |  2   222      .    222      . |
 |  3   331    331      .      . |
 |-------------------------------|
 |  3   332      .    332      . |
 |  3   333      .      .    333 |
 +-------------------------------+

然后可以折叠它而不会丢失与 each 相关联id的唯一值。varid

 +-------------------------+
 | id   var1   var2   var3 |
 |-------------------------|
 |  1    112    113      . |
 |  2    221    222      . |
 |  3    331    332    333 |
 +-------------------------+

我可以这样做:

bysort id: egen id_rank = rank(var)
tabulate var_rank                       /// identify highest rank
by id, sort : gen var1 = var if var_rank == 1
by id, sort : gen var2 = var if var_rank == 2
by id, sort : gen var3 = var if var_rank == 3

但是,如果每个 id(我这样做)有超过 3 个 var 并且每个 var 有不同数量的 var 怎么办?我需要正确的代码(例如使用_n?循环?)来自动识别列foreach中的最高排名并为每个.var_rankvarid

任何想法将不胜感激!

4

1 回答 1

2

这两行应该从您的演示输入到您的演示输出:

bysort id: gen j = _n
reshape wide var, i(id) j(j)

reshape是一个令人困惑但非常强大的命令,绝对值得学习使用它而不是疯狂地手动重塑数据集。

于 2013-09-09T20:46:05.777 回答