这个问题似乎应该是一些可以轻松完成的事情 直截了当的代码行,但我还没有找到办法:
我想采取这样的方式:
+---------------+
| 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 |
+-------------------------------+
然后可以id
折叠,而不会丢失与var
相关联的id
的唯一值。
+-------------------------+
| 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数量不同呢?我需要正确的代码(例如使用_n
?foreach
循环?)来自动识别var_rank
列中的最高排名,并为每个{填写现有var
值{1}}。
任何想法都将不胜感激!!
答案 0 :(得分:2)
这两行应该从你的演示输入到你的演示输出:
bysort id: gen j = _n
reshape wide var, i(id) j(j)
reshape
是一个令人困惑但非常强大的命令,它绝对值得学习使用它,而不是疯狂地手动重塑数据集。