全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
17610 22
2013-06-22
悬赏 10000 个论坛币 已解决
有如下格式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
...

哪位高手有什么好的解决方法么?
非常感谢!
Example.xls
大小:(480.5 KB)

 马上下载


我已将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==""


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

Example.xls

大小:485 KB

 马上下载

最佳答案

voodoo 查看完整内容

满有趣的题目,也是个数据处理中满常碰见问题。当然还有高的悬赏金额——于是我来啦! 全部利用Stata完成有点困难(但也不是一定不可以,只是最终程序应该会长挺多!) 以下的处理方法结合Excel-Word-Stata共同完成,处理思路和操作相对简单直观,希望楼主喜欢啦。 Stata命令的.do文档以及手工预处理过程中生成的.docx和.csv文档:
二维码

扫码加我 拉你入群

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

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

全部回复
2013-6-22 23:18:23
满有趣的题目,也是个数据处理中满常碰见问题。当然还有高的悬赏金额——于是我来啦!

全部利用Stata完成有点困难(但也不是一定不可以,只是最终程序应该会长挺多!)
以下的处理方法结合Excel-Word-Stata共同完成,处理思路和操作相对简单直观,希望楼主喜欢啦。
复制代码

Stata命令的.do文档以及手工预处理过程中生成的.docx和.csv文档:
Example.zip
大小:(490.59 KB)

 马上下载

本附件包括:

  • Example.do
  • Example.docx
  • Example.csv



二维码

扫码加我 拉你入群

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

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

2013-6-24 01:33:18
*(最多只需一步手工)把excel数据直接用edit窗口复制到stata中,存成a,可见其中数据排列的特征

use a,clear /*可选*/
g y=real(number)==.
g x=(id!="")&y
replace assignment=id if x
replace x=x[_n-1]+1 if x[_n-1]&y
replace id=number if y&x<2
replace assignment=number if x>1
replace number=number[_n-1] if y
replace y=_n
bys number (y): egen m=max(x)
bys number (y): replace assignment=assignment[_n+m-1] if m
drop if id==""
sort y /*不保留原始顺序,可取消此步*/
drop y x m
二维码

扫码加我 拉你入群

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

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

2013-6-24 09:58:31
sungmoo 发表于 2013-6-24 01:33
*(最多只需一步手工)把excel数据直接用edit窗口复制到stata中,存成a,可见其中数据排列的特征

use a, ...
sungmoo提供的方法最初我也想尝试过,但考虑到直接从Excel中copy+paste到Stata存在严重的错行与错列问题。而要发现错行错列的规律并将这一规律逆向还原为Stata代码,这几乎要求坛友要具备像sungmoo一样高超的技能!至少我目前还不具备这样的能力——本人在阅读sungmoo提供的代码时,感觉其可读性/可理解性并不太好。










二维码

扫码加我 拉你入群

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

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

2013-6-24 12:17:38
voodoo 发表于 2013-6-24 09:58
sungmoo提供的方法最初我也想尝试过,但考虑到直接从Excel中copy+paste到Stata存在严重的错行与错列问题。 ...
如果您是指excle中的查找替代在哪里,请看下图
excel_find_and_replace.JPG
excle 有关同一单位格【台湾称储存格】,多行变成一行,可以参照下面网址
http://isvincent.blogspot.tw/2011/01/excel_11.html

我当时的想法是,一开始先把这个多行变成一行后【断行处理】,【重要字词与字词间用个符号代掉】
再利用拆字词的方式…
【所以我说我的做法与voodoo相近】

我知道观念很简单,但实务操作上很费时费工,虽然论坛币奖赏很多,
问题是哪几天是星期六日,开车去玩也是很重要的  @_@
所以我…… 当作没看到……


二维码

扫码加我 拉你入群

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

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

2013-6-24 13:13:39
h3327156 发表于 2013-6-24 12:17
如果您是指excle中的查找替代在哪里,请看下图

excle 有关同一单位格【台湾称储存格】,多行变成一行, ...
excel 直接查找替换的方法不错;
一开始没有找到 换行该怎么查找。现在终于知道了。


现在也就先在excel里面查找,替换;
然后再用voodoo的do 文件就解决问题了。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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