搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  Example.zip
资料下载链接地址: https://bbs.pinggu.org/a-1355435.html
本附件包括:
  • Example.do
  • Example.docx
  • Example.csv
附件大小:
490.59 KB   举报本内容
有如下格式excel数据:
Number ID Assignment
1 A AS1
B AS2
C AS3
2 A AS5
D AS2
3 E AS6
...


以Number为1的这个观察值来说,ID:A,B,C在同一个excel单元格里的不同行,同理Assigment:AS1,AS2,AS3也在同一个excel单元格里的不同行。

现想用stata将同一个单元格中不同行的string转入不同观察值,如下格式所示:
Number ID Assignment
1 A AS1
1 B AS2
1 C AS3
2 A AS5
2 D AS2
3 E AS6
...

哪位高手有什么好的解决方法么?
非常感谢!

我已将voodoo提供的方法评为最佳答案,思路清晰,程序简洁明了。sungmoo提供的方案也很好,但是正如voodoo所说,excel copy+paste到stata产生错行,用Stata编程解决错行,并达成最终目的,这恐怕只有像sungmoo一样具备极高超技能才能解决,一般人不太容易理解。

但是voodoo的方法离完美还差那么一点点,问题就在于第一步excel的预处理,这里还要感谢h3327156提供的excel预处理方法。但是即便excel能够替换“换行或回车”为指定的字符串,我仍觉得在尽可能的情况下用Stata提供一站式解决方案最好。


那么现在的问题就转换为如何用Stata处理导入excel带来的换行问题。Dr Nick Cox编写的charlist(需要ssc install)可以查看variable中包含的ASCII码,但是很遗憾,经我试验,这个命令并不显示“换行”字符经Statalist上Joseph Coveney的提示,char(10)和 char(13)分别代表line feed和carriage return。于是我用subinstr解决字符替换问题。最后结合voodoo的代码后,我编写完整程序如下:

***import data***

clear

import excel "Example.xlsx", sheet("sheet1") firstrow

***replace line feed with "///"***

gen ids=subinstr(ID,char(10),"///",.)

gen assignments=subinstr(Assignment,char(10),"///",.)

***split each ID and Assignment into different observations***

split ids, gen(ID) parse("///")

split assignments, gen(Assignment) parse("///")

drop ID Assignment ids assignments

***reshape to long data***

reshape long ID Assignment, i(Number) j(num)

drop if ID==""&Assignment==""


针对上述程序,sungmoo又提出了让代码更简洁的修改建议

import excel "Example.xls", sh("sheet1") first clear
split ID, p(`=char(10)')
split Assignment, p(`=char(10)')
drop ID Assignment
reshape long ID Assignment, i(Number)
drop if ID==""


最后感谢所有参与这个帖子讨论的人,真的获益良多。



    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2026-1-19 20:47