识别具有两个变量的组
Identify group with two variables
假设我在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 的每个观察结果。
我不确定我是否理解这里的定义(例如 tna
和 ret
没有解释;相反,如果它们不相关,请从问题中省略它们;"start"暗示一个时间过程?),但为什么不在每个 id
中复制 name
的第一个值,然后根据名字进行分类? (使用您的示例数据,结果是相同的。)
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 |
+---------------------------------------+
这是一个棘手的问题,因为它可能需要多次通过才能完全稳定标识符。幸运的是,您可以使用 group_id
(来自 SSC)来解决这个问题。要安装 group_id
,请输入 Stata 的命令 window:
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)
假设我在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 的每个观察结果。
我不确定我是否理解这里的定义(例如 tna
和 ret
没有解释;相反,如果它们不相关,请从问题中省略它们;"start"暗示一个时间过程?),但为什么不在每个 id
中复制 name
的第一个值,然后根据名字进行分类? (使用您的示例数据,结果是相同的。)
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 |
+---------------------------------------+
这是一个棘手的问题,因为它可能需要多次通过才能完全稳定标识符。幸运的是,您可以使用 group_id
(来自 SSC)来解决这个问题。要安装 group_id
,请输入 Stata 的命令 window:
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)