查看原文
其他

分行显示的固定宽度文件读入(下)

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:孙雪丽

本文编辑:张    宇

技术总编:李春涛

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

往期推文《分行显示的固定宽度文件读入(上)—数据字典法》中,我们为大家介绍了如何用临时句柄创建一个分行显示的固定宽度数据,以及如何用数据字典将其读入。对于分行显示的固定宽度数据,不只数据字典一种读入方法,今天我们接着(上)篇为大家介绍另外两种读入方法。

我们依然以stgrade.txt这一文件的读入为例。

stgrade.txt(如下图,部分截取)是我们构造的一份学生成绩文件(构建方法请读者参考(上)篇),文件中包含学生姓名、年龄及各个科目的成绩。其中1-3行为变量名,Name、Age、Math、English处于第一行,Economics、FineArts处于第二行,History处于第三行。第四行以后是199位学生的成绩信息,学生的各门成绩与1-3行的变量名相对应且每个学生的信息同样占据三行,每两个学生信息之间用三行“*”分隔。用Stata读入时我们希望1-3行的变量名读入一行中,而后的每个学生样本(每个学生样本占3行)也分别作为一条观测值读入。

以下分别介绍import delimited命令和infix命令读取"stgrade.txt"的方法。

方法一:import delimited命令读入

import delimited命令用于读入以逗号、制表符或其他指定分隔符分隔的文件(具体用法参见《数据读入系列之import delimited介绍》)。该命令将文本文件中每一行作为一个观测值读入Stata,那么对于这个三行显示一条完整观测数据的文件来说,是否意味着import delimited命令就无能为力了呢?并不是。方法一为大家介绍如何将import delimited读入的数据整理为所需模样。读入程序如下:

clear cap mkdir D:/学生成绩 cd D:/学生成绩
import delimited using stgrade.txt   //stgrade.txt读者可自行构造

文件中不存在import delimited命令默认的分隔符(逗号和制表符),且未指定分隔符,故文件被读入一个变量v1下。接下来我们一步步进行整理。

1、删除无关信息“*”行

index()是一个字符串函数。index(v1,"*")表示若变量v1中出现“*”,则返回“*”在v1中的位置(一个非零的数字),若v1中没有定位到“*”,则返回0。根据这一思路,删除返回值非0的行:

drop if index(v1,"*") != 0

2、合并观测值

数据中1-3行为变量名信息,4-6行为第一个学生的信息,7-9行为第二个学生的信息……我们需将2、3行合并至第1行,5、6行合并至第4行,8、9行合并至第7行……也就是,如果某一行的行号除以3余数为1,就把它的下两行加至该行,程序如下:

replace v1 = v1 + " " + v1[_n+1] + " " + v1[_n+2] if mod(_n, 3) == 1

3、保留具有完整学生信息的行

经过第2步,分行显示的学生信息合并至一行中了,不难发现这些完整的学生信息分别处于第1行、第4行、第7行……,即保留行号除以3余数为1的行:

keep if mod(_n, 3) == 1

4、分拆v1

经过2、3步,数据中每个学生的信息占据一行且所有信息均处于变量v1下,为了便于处理观测值(如进行加减求和等运算),将v1进行分拆:

split v1   //split命令默认以空格为分隔符将v1分拆为v11-v17七个变量

分拆完成后,执行以下程序删除多余变量v1、把第1行变为变量名并将字符型变量转化为数值型变量:

drop v1 nrow     //第一行变为变量名,nrow为外部命令,安装程序为:ssc install nrow destring _all,replace save stgrade.dta,replace

整理得到的数据如下图(部分截取):

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!

方法二:infix命令读入

Infix命令是读入固定宽度数据的一大利器,对于分行显示的固定宽度数据,infix命令的读取格式为:

infix # lines #: [byte|int|float|long|double|str] varlist #-# using filename,[option]

# lines 表示每读取一个观测数据需要遍历#行,对于此文件Stata每读取一个学生信息需要遍历3行;

#: 表示跳转至第#行进行读取,如“2:”表示跳转至数据的第2行读取;

[byte|int|float|long|double|str]表示读取变量的类型;

varlist为读取的变量名;

#-# 为读取的变量所占的列数;

stgrade.txt的读取程序如下:

clear cd D:/学生成绩 infix 3 lines 1: str19 Name 1-19  str9 Age 20-28  str9 Math 30-38  str9 English 40-48 ///              
             2: str14 Economics 1-14  str9 FineArts 15-24 ///              
             3: str10 History 1-9  using stgrade.txt

可以看到infix命令读入的数据与(上)篇数据字典法一模一样,后续处理类似:

drop if mod(_n, 2) == 1   //删除奇数行 destring _all,replace     //字符型变量转换为数值型变量 save stgrade.dta,replace

最终读入的数据如下(部分截取):

至此,我们介绍了分行显示的固定宽度数据的三种读入方法:数据字典读入、import delimited读入及infix读入,哪种方法最简单呢?显然是infix命令。在后续的推文中我们会详细为大家介绍infix命令的其他用法。

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存