全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
12773 8
2015-04-23
悬赏 10000 个论坛币 已解决
有如下格式数据:
i         j              a                    b            
1        1         com 1                AAA
1        2         firm abc             BBB
2        1         firm def              AAA
2        2         com  3               CCC
2        3         firm  45c            AAA
2        4         com  xyz            CCC
3        1         com  sdf             BBB
3        2         com 1e             AAA
3        3         firm ddx             CCC
.


希望将以上格式数据变为如下格式数据:

i              a                                                      b
1      com 1/firm abc                                    AAA/BBB
2      firm def/com 3/firm 45c/com xyz           AAA/CCC/AAA/CCC
3      com sdf/com 1e/firm ddx                      BBB/AAA/CCC  
.

很明显以上问题可以通过reshape命令:
reshape wide a b, i(i) j(j)
得到如下格式数据:
i          a1          a2           a3          a4           b1       b2     b3     b4
1      com 1      firm abc                                AAA    BBB
2      firm def    com 3     firm 45c  com xyz     AAA    CCC   AAA   CCC
3      com sdf    com 1e   firm ddx                   BBB    AAA   CCC  
.

然后运行如下命令:
gen a=a1+"/"+a2+"/"+a3+"/"+a4
gen b=b1+"/"+b2+"/"+b3+"/"+b4

但是以上方法,通过reshape,会生成a1,a2,...,an,b1,b2,...,bn列,n随着数据的不同而不同,继续用gen命令生成合并的单元格需要先观察reshape的结果,再写a1+...+an。因此,有没有自动的方法解决这个问题,即每次不需要在reshape后观察数据再合并单元格。另外,用gen的方法,会在未达到n列的单元格结尾生成不必要的“/”,以上述问题为例,在第一行的a列会生成如下字符串:com1/firm abc//

另外,有没有不通过reshape解决以上问题的方法?

非常感谢


最佳答案

sophia 查看完整内容

谢悬赏! * 处理过程如下: * 查看 list * 1 通过排序和下标合并数据 sort i j replace a=a+"/"+a[_n-1] if i==i[_n-1] replace b=b+"/"+b[_n-1] if i==i[_n-1] * 2 清除冗余数据和变量 drop if i==i[_n+1] drop j * 查看 list 日志如下: . list +------------------------+ | i j a b | |------------------------| 1. | 1 1 com 1 AAA | ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2015-4-23 04:54:58
谢悬赏!

* 处理过程如下:

* 查看
list

* 1 通过排序和下标合并数据
sort i j
replace a=a+"/"+a[_n-1] if i==i[_n-1]
replace b=b+"/"+b[_n-1] if i==i[_n-1]

* 2 清除冗余数据和变量
drop if i==i[_n+1]
drop j

* 查看
list





日志如下:
. list


     +------------------------+
     | i   j          a     b |
     |------------------------|
  1. | 1   1      com 1   AAA |
  2. | 1   2   firm abc   BBB |
  3. | 2   1   firm def   AAA |
  4. | 2   2      com 3   CCC |
  5. | 2   3   firm 45c   AAA |
     |------------------------|
  6. | 2   4    com xyz   CCC |
  7. | 3   1    com sdf   BBB |
  8. | 3   2     com 1e   AAA |
  9. | 3   3   firm ddx   CCC |
     +------------------------+


.
. sort i j


. replace a=a+"/"+a[_n-1] if i==i[_n-1]
variable a was str8 now str31
(6 real changes made)


. replace b=b+"/"+b[_n-1] if i==i[_n-1]
variable b was str3 now str15
(6 real changes made)


. drop if i==i[_n+1]
(6 observations deleted)


. drop j


. list


     +-------------------------------------------------------+
     | i                                 a                 b |
     |-------------------------------------------------------|
  1. | 1                    firm abc/com 1           BBB/AAA |
  2. | 2   com xyz/firm 45c/com 3/firm def   CCC/AAA/CCC/AAA |
  3. | 3           firm ddx/com 1e/com sdf       CCC/AAA/BBB |
     +-------------------------------------------------------+
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-23 08:33:27
楼主,我帮你搞定了,我仍然使用了resharp,不过更加智能,不需要自己去查看resharp后的列数,而且自动删除最后的“/”,程序为:bysort i: egen idnum = count(j)
reshape wide a b, i(i) j(j)
gen a = "."
gen b = "."
set trace on
sum idnum
local m = r(max)
forvalues n = 1(1)`m'{
    replace a = a + "\" + a`n'
        replace b = b + "\" + b`n'
}
egen aa = msub(a), f(".\") r("")
egen bb = msub(b), f(".\") r("")
dropvars aa1 bb1
gen aa1 = regexr(aa, "[\]*", "")
gen bb1= regexr(bb, "[\]*", "")
drop a b aa bb
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-23 08:44:29
通过排序和下标合并数据,参考楼下

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-23 09:14:20
来晚了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2015-4-23 14:32:45
来晚了 总之解决了就好!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群