请输入标题 bcdef
在《如何用Stata批量读取多张工作表的Excel文件》推 文中,小编介绍了如何读取Excel表格中的不同sheet,在这篇推文中小编介绍的方法是批量读取多张工作表的Excel文件的基础框架,在我们的实际 操作中往往需要根据具体问题在基础框架上做一些调整,这不,有位朋友在基础框架里加入reshape命令时就出现了问题。到底怎么回事呢?下面就听小编叨 叨吧。
请输入标题 abcdefg
我 们现在有一份Excel文件,文件中是31个省份16年的全社会固定资产投资额、房地产开发投资额、商品房销售价格、城镇居民消费水平、国内生产总值、金 融增加值、房地产增加值、城镇居民人均可支配收入的数据(共8个变量),这8个变量16年的数据分别在该Excel表的不同sheet中,每一个 sheet中的数据都是宽型的,如下图所示:
现在,我们想把这份Excel中的数据读取到Stata中,形成NxTxV(31个省x16年x8个变量)的面板数据,那么就需要在推文《如何用Stata批量读取多张工作表的Excel文件》介绍的方法上增加数据长型和宽型转换的命令(reshape命令)。在转换时,需要指定reshape的对象,具体到全社会固定资产投资额表中也就是“gdz”,为了能将“gdz”这串字符提取出来,需要用到ds命令的返回值。(ds命令详见往前推文ds命令:查看和描述变量)
ds命令是用来列示变量的名称或者其他特征的,同时ds命令会产生一个返回值r(varlist),r(varlist)将所有的变量名储存为一个字符串以空格隔开。
以全社会固定资产投资额表为例:
clear
import excel using 31prov,describe
import excel using 31prov,sheet(`r(worksheet_1)') ///
cellrange(`r(range_1)') firstrow clear
ds
return list
可以看到所有的变量名形成了一个字符串。
那么从这个字符串中提取出“gdz”就要用到处理字符型变量的函数,如substr( )函数、word( )函数、和length( )函数,对字符串函数不熟悉的朋友,可查看往期推文,或help文件。
gen v = substr(word("`r(varlist)'", 2), 1, length(word("`r(varlist)'", 2)) - 1)
dis v
这样,我们就把reshape的目标提取出来了。
而在对8个sheet批量处理时,就不能将上文中的v设置成变量,而是需要需要将v设置成宏了。程序如下:
clear
import excel using 31prov,describe
forvalues s=1(1)`r(N_worksheet)'{
import excel using 31prov,sheet(`r(worksheet_`s')') ///
cellrange(`r(range_`s')') firstrow clear
ds
local v = substr(word("`r(varlist)'", 2), 1, length(word("`r(varlist)'", 2)) - 1)
reshape long `v', i(id) j(year)
save data`s',replace
}
import excel using 31prov,describe
forvalues s = 1/`r(N_worksheet)' {
merge id year using data`s'.dta
drop _merge
}
save data_all.dta,replace
当我们满心欢喜的打开数据窗口的时候,却惊讶的发现得到的stata结果却是这样的:
明明对8个sheet都做了merge,为什么最后结果却只有一个变量了。返回查看每次命令执行后的提示(以data1和data2为例),我们看到列示每一次数据读取的都是社会固定资产投资额表中的数据,reshape也都是针对gdz的,所以在merge的时候就变成对8份内容相同的数据merge,最后也就只有gdz变量了。
这 是因为在循环中用了describe的返回值r(N_worksheet),但是使用reshape后也会出现返回值,而stata只能存储就近一次命令 的返回值。当我们使用了reshape命令后,describe的返回值r(N_worksheet)就已经从内存中抹去了,内存里只有reshape的 返回值。
那么这个问题该怎么解决呢?解决的办法就是在describe之后将返回值r(N_worksheet)放入局部宏里面,在r(N_worksheet)被抹去之前提前储存起来。
clear
import excel using 31prov,describe
local N = `r(N_worksheet)' // 将返回值r(N_worksheet)放入局部宏之后,需要对用到返回值r(N_worksheet)的import命令中的sheet选项和cellrange选项重新设定
forvalues i = 1/`N' {
local sheet`i' = "`r(worksheet_`i')'"
local range`i' = "`r(range_`i')'"
}
万事具备后,再提取Excel中每一个sheet中的数据
forvalues s=1(1)`N'{
import excel using 31prov,sheet(`sheet`s'') ///
cellrange(`range`s'') firstrow clear
ds
local v = substr(word("`r(varlist)'", 2), 1, length(word("`r(varlist)'", 2)) - 1)
reshape long `v', i(id) j(year)
save data`s',replace
}
程序run完后,我们看到屏幕上的提示和之前的也不一样了,还是以data1和data2为例,data1中保存的是gdz的数据,data2中保存的是hkf的数据。
再接着使用merge命令
forvalues s=1(1)`N'{
merge id year using data`s'.dta
drop _merge
}
save data_all.dta,replace
再打开数据窗口,这时我们看到merge后的结果包含所有的变量。
返回值很淘气,在使用返回值的时候要多多注意哦。
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑:司海涛
技术总编:刘贝贝
往期推文推荐:
7.一言不合就用stata写邮件(Outlook/Foxmail)
9.I have a Stata, I have a python
10.I have a Stata, I have a Python之二——pdf转word
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。
欢迎关注爬虫俱乐部
微信扫一扫
关注该公众号