有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
ps:喜大普奔,爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io
粉丝们可以通过该网站访问过去的推文啦~
在数据搜集和处理的过程中,我们常常会遇到如何将多列数据转换为一列或如何将一列数据转换为多列的问题。前几天,我们在推文《有问必答:一列变多列》中总结了“一列变多列”的四种常用方法。相对应的,今天我们也整理了四种“多列变一列”的常用方法。
我们以“211大学目录.txt”为例(数据链接:https://raw.githubusercontent.com/Stata-Club/Sharing-Center-of-Stata-Club/master/article/211%E5%A4%A7%E5%AD%A6%E7%9B%AE%E5%BD%95.txt),使用infix命令读入。
clear
cd D:\多列变一列
infix str200 univ 1-200 using 211大学目录.txt, clear
drop if univ=="" //删除空行
split univ, parse(;) //以;为分隔符分隔变量
drop univ
此时我们得到了3列数据,我们想把这些内容合并为一列,该怎么做呢?在这里我们介绍四种常用方法。
01
preserve& restore
很自然地,我们首先想到了preserve和restore这一起死回生术,分别保留第1列、第2列、第3列数据生成3个dta文件,然后用append命令将这3个dta文件合并,程序如下:
preserve
keep univ1
rename univ1 univ
save temp1, replace
restore
preserve
keep univ2
rename univ2 univ
save temp2, replace
restore
preserve
keep univ3
rename univ3 univ
save temp3, replace
restore
clear
append using temp1
append using temp2
append using temp3
erase temp1.dta
erase temp2.dta
erase temp3.dta
drop if univ == ""
save 211大学目录, replace
这样我们就将3列数据合并为1列啦。
上述程序也可以写入循环:
local i = 1
foreach var of varlist * {
preserve
keep `var'
rename `var' univ
save temp`i', replace
local i = `i' + 1
restore
}
clear
fs *.dta
foreach f in `r(files)' {
append using `f'
erase `f'
}
drop if univ == ""
save 211大学目录, replace
02
expand
preserve和restore这个方法虽然很容易想到,但是真的太麻烦啦。我们可以使用expand命令先将观测值扩充至3倍:
expand 3
sort univ1
通 过观察我们发现,每个观测值都出现了3次。比如,变量univ1的前3个观测值都是“上海大学”,此时,我们便可以用变量univ2的第1个观测值“同济 大学”替换掉变量univ1的第1个观测值“上海大学”,用变量univ3的第2个观测值“华东理工大学”替换掉变量univ1的第2个观测值“上海大 学”,通过mod()函数进行判断重复上述替换过程,然后保留univ1就可以啦,程序如下:
replace univ1 = univ2 if mod(_n,3) == 1
replace univ1 = univ3 if mod(_n,3) == 2
keep univ1
drop if univ1 == ""
save 211大学目录, replace
这样我们就又得到需要的数据啦。
03
post
post命令是数据处理的法宝,我们已经介绍过很多次啦(详见《免费事件研究,一片片从邮局寄来》、《免费事件研究,一片片从邮局寄来——国泰安版本》、《如何输出中国上市公司上一个交易日的收盘价》)。具体程序如下:
capture postclose mypost
postfile mypost str100 univ using temp.dta, replace
forvalues i = 1/`=_N' {
post mypost (univ1[`i'])
post mypost (univ2[`i'])
post mypost (univ3[`i'])
}
postclose mypost
use temp.dta,clear
drop if univ == ""
save 211大学目录, replace
这样多列数据就轻松转换成一列啦。
04
stack
我们在推文《巧用stack命令,堆栈变量内容》中详细介绍了十分方便的stack命令,在这里,我们使用stack命令将变量univ1、univ2、univ3转换为新的变量var,并显示所有初始变量:
stack univ1 univ2 univ3, into(var) clear wide
keep var //保留变量var
rename var univ //重命名var为univ
drop if univ == ""
save 211大学目录, replace
我们就又一次将多列数据转换成一列啦,是不是很方便呢?
注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您 更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑/徐露露
技术总编/刘贝贝
往期推文推荐:
5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件
6.putdocx+wordconvert—将实证结果输出到Word(.docx)文档
7.Stata 15之Markdown——没有做不到,只有想不到!
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。
欢迎关注爬虫俱乐部
微信扫一扫
关注该公众号