楼主: xingxf
11171 8

[数据管理求助] 合并多个单元格中的字符串 [推广有奖]

  • 0关注
  • 50粉丝

副教授

12%

还不是VIP/贵宾

-

威望
0
论坛币
60602 个
通用积分
745.3724
学术水平
224 点
热心指数
251 点
信用等级
138 点
经验
20781 点
帖子
755
精华
0
在线时间
521 小时
注册时间
2011-3-12
最后登录
2024-4-4

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 | ...
关键词:单元格 字符串 reshape Shape FIRM 字符串

回帖推荐

liuding1111 发表于3楼  查看完整内容

楼主,我帮你搞定了,我仍然使用了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), ...
沙发
sophia 发表于 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 |
     +-------------------------------------------------------+
已有 4 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
潇潇木枼 + 1 + 2 + 2 + 2 精彩帖子
ncjgxy + 1 + 1 + 1 热心帮助其他会员
xingxf + 5 + 5 + 5 精彩帖子
admin_kefu + 40 热心帮助其他会员

总评分: 论坛币 + 41  学术水平 + 8  热心指数 + 8  信用等级 + 8   查看全部评分

使用道具

藤椅
liuding1111 发表于 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
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
xingxf + 5 + 5 + 5 精彩帖子
admin_kefu + 30 热心帮助其他会员

总评分: 论坛币 + 30  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

板凳
sophia 发表于 2015-4-23 08:44:29 |只看作者 |坛友微信交流群
通过排序和下标合并数据,参考楼下

使用道具

报纸
kerrydu 发表于 2015-4-23 09:14:20 |只看作者 |坛友微信交流群
来晚了

使用道具

地板
carweed 发表于 2015-4-23 14:32:45 |只看作者 |坛友微信交流群
来晚了 总之解决了就好!

使用道具

7
xingxf 发表于 2015-4-25 05:57:06 |只看作者 |坛友微信交流群
liuding1111 发表于 2015-4-23 08:33
楼主,我帮你搞定了,我仍然使用了resharp,不过更加智能,不需要自己去查看resharp后的列数,而且自动删除 ...
非常感谢,你这个思路很有帮助。但是程序中间有些问题吧?不知道你用这个命令试验过没有。
egen里没有msub这个函数吧?
dropvars是指什么呢

使用道具

8
liuding1111 发表于 2015-4-25 08:12:47 |只看作者 |坛友微信交流群
xingxf 发表于 2015-4-25 05:57
非常感谢,你这个思路很有帮助。但是程序中间有些问题吧?不知道你用这个命令试验过没有。
egen里没有ms ...
我用了你的原始数据实验,结果如预期。musb是egenmore中的函数,需要ssc install egenmore, replace,musb是个很有用的字符函数。dropvars也是一个外部命令,类似于cap drop。我在调试时加了set trace on,现在程序已经可以顺利运行了,set trace on不需要。

使用道具

9
潇潇木枼 发表于 2021-2-1 21:11:52 |只看作者 |坛友微信交流群
sophia 发表于 2015-4-23 04:54
谢悬赏!

* 处理过程如下:
大神!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 00:02