我将组成员资格编码为虚拟变量,如下所示:
+--------------------------+
| group1 group2 group3 |
|--------------------------|
1. | 0 1 0 |
2. | 0 0 1 |
3. | 0 0 1 |
4. | 0 1 0 |
5. | 1 0 0 |
6. | 1 0 0 |
7. | 1 0 0 |
8. | 1 0 0 |
+--------------------------+
我想将三个groupX
变量转换为单个变量,如下所示:
group
2
3
3
2
1
1
1
1
这是"反向"做xi i.group
,从傻瓜创建一个分类变量。
我想egen foo = group(group*)
但似乎奇怪地对结果变量进行编码:
+--------------------------------+
| group1 group2 group3 foo |
|--------------------------------|
1. | 0 1 0 2 |
2. | 0 0 1 1 |
3. | 0 0 1 1 |
4. | 0 1 0 2 |
5. | 1 0 0 3 |
|--------------------------------|
6. | 1 0 0 3 |
7. | 1 0 0 3 |
8. | 1 0 0 3 |
+--------------------------------+
请注意,egen
已将第3组编码为1,将第1组编码为3。
答案 0 :(得分:1)
你的问题似乎预先假定了一些强有力的假设,即变量已经有后缀1,并且指标变量是不相交的。
既然如此,这是您代码的替代方案:
input group1 group2 group3
0 1 0
0 0 1
0 0 1
0 1 0
1 0 0
1 0 0
1 0 0
1 0 0
end
gen group = group1
forval j = 2/3 {
replace group = `j' if group`j'
}
排序egen, group(
varlist )
的基本原理是,其结果取决于sort
varlist 之后的排序在您的情况下,首先0 0 1
,0 1 0
秒,1 0 0
最后,0
在1
之前对Stata规则排序,排序首先在第一个变量,第二个变量的第二个,依此类推。 egen
的此函数用于对任何变量组合进行分组。数字(指示符或其他)或字符串。
编辑:这种技术更为通用。一个关键的假设仍然是,在一组变量的每次观察中,1只出现一次。但是没有关于变量数量的假设,并且变量名称不需要具有一些前缀:您只需要通过给出实际变量名称的内容替换group*
。
. egen sgroup = concat(group*)
. gen group = strpos(sgroup, "1")
. l
+-------------------------------------------+
| group1 group2 group3 sgroup group |
|-------------------------------------------|
1. | 0 1 0 010 2 |
2. | 0 0 1 001 3 |
3. | 0 0 1 001 3 |
4. | 0 1 0 010 2 |
5. | 1 0 0 100 1 |
|-------------------------------------------|
6. | 1 0 0 100 1 |
7. | 1 0 0 100 1 |
8. | 1 0 0 100 1 |
+-------------------------------------------+
答案 1 :(得分:0)
这是一种非常笨拙的做法,但我确信有更明智的方法:
gen id = _n
reshape long group, i(id)
drop if group == 0
drop group id
rename _j group
结果是:
+-----------------+
| group country |
|-----------------|
1. | 2 FOO |
2. | 3 FOO |
3. | 3 FOO |
4. | 2 BAR |
5. | 1 BAR |
6. | 1 BAR |
7. | 1 BAR |
8. | 1 BAR |
+-----------------+