有如下格式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
...
哪位高手有什么好的解决方法么?
非常感谢!
2013-6-25 00:51:20 上传
我已将voodoo提供的方法评为最佳答案,思路清晰,程序简洁明了。sungmoo提供的方案也很好,但是正如voodoo所说,excel copy+paste到stata产生错行,用Stata编程解决错行,并达成最终目的,这恐怕只有像sungmoo一样具备极高超技能才能解决,一般人不太容易理解。
但是voodoo的方法离完美还差那么一点点,问题就在于第一步excel的预处理,这里还要感谢那么现在的问题就转换为如何用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==""
最后感谢所有参与这个帖子讨论的人,真的获益良多。