识别具有两个变量的组

时间:2016-05-01 12:47:11

标签: stata identify

假设我在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的所有观察结果。例如:

  1. X位于两个ID下的数据集中:1和2. X组应包含名称为X的所有观察,但也包含两个名称P的观察结果(自X开始在ID 2中开始,而两个值为P的观察属于组X

  2. Y在ID 3中开始,因此该小组应将每个观察结果与ID 3合并。

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解这里的定义(例如tnaret没有被解释;相反,如果它们是不相关的,则从问题中省略它们;“开始”意味着一个过程时间?),但为什么不在每个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)