假设我在Stata中有以下数据:
clear
input id tna ret str2 name
1 2 3 "X"
1 3 2 "X"
1 5 3 "X"
1 6 -1 "X"
2 4 2 "X"
2 6 -1 "X"
2 8 -2 "X"
2 9 3 "P"
2 11 -2 "P"
3 3 1 "Y"
3 4 0 "Y"
3 6 -1 "Y"
3 8 1 "Z"
3 6 1 "Z"
end
我想为新群组制作ID。这些新组应该包含具有相同名称的观察结果(例如X),但如果名称在该ID中开始,则还应包含相同ID的所有观察结果。例如:
X
位于两个ID下的数据集中:1和2. X
组应包含名称为X
的所有观察,但也包含两个名称P
的观察结果(自X
开始在ID 2中开始,而两个值为P
的观察属于组X
)
Y
在ID 3中开始,因此该小组应将每个观察结果与ID 3合并。
答案 0 :(得分:0)
我不确定我是否理解这里的定义(例如tna
和ret
没有被解释;相反,如果它们是不相关的,则从问题中省略它们;“开始”意味着一个过程时间?),但为什么不在每个name
中复制id
的第一个值,然后对名字进行分类? (使用示例数据,结果是相同的。)
clear
input id tna ret str2 name
1 2 3 "X"
1 3 2 "X"
1 5 3 "X"
1 6 -1 "X"
2 4 2 "X"
2 6 -1 "X"
2 8 -2 "X"
2 9 3 "P"
2 11 -2 "P"
3 3 1 "Y"
3 4 0 "Y"
3 6 -1 "Y"
3 8 1 "Z"
3 6 1 "Z"
end
sort id, stable
by id: gen first = name[1]
egen group = group(first), label
list, sepby(group)
+---------------------------------------+
| id tna ret name first group |
|---------------------------------------|
1. | 1 2 3 X X X |
2. | 1 3 2 X X X |
3. | 1 5 3 X X X |
4. | 1 6 -1 X X X |
5. | 2 4 2 X X X |
6. | 2 6 -1 X X X |
7. | 2 8 -2 X X X |
8. | 2 9 3 P X X |
9. | 2 11 -2 P X X |
|---------------------------------------|
10. | 3 3 1 Y Y Y |
11. | 3 4 0 Y Y Y |
12. | 3 6 -1 Y Y Y |
13. | 3 8 1 Z Y Y |
14. | 3 6 1 Z Y Y |
+---------------------------------------+
答案 1 :(得分:0)
这是一个难以解决的问题,因为完全稳定标识符可能需要多次通过。幸运的是,您可以使用group_id
(来自SSC)来解决此问题。要安装group_id
,请输入Stata的命令窗口:
ssc install group_id
这是一个更复杂的数据示例,其中" P"同样出现在ID == 4
中,ID
也包含" A"作为一个名字:
* Example generated by -dataex-. To install: ssc install dataex
clear
input float(id tna ret) str2 name
1 2 3 "X"
1 3 2 "X"
1 5 3 "X"
1 6 -1 "X"
2 4 2 "X"
2 6 -1 "X"
2 8 -2 "X"
2 9 3 "P"
2 11 -2 "P"
3 3 1 "Y"
3 4 0 "Y"
3 6 -1 "Y"
3 8 1 "Z"
3 6 1 "Z"
4 9 3 "P"
4 11 -2 "P"
4 12 0 "A"
end
clonevar newid = id
group_id newid, match(name)