查看原文
其他

Stata中字符串的处理

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

本文作者:陈丹慧,中南财经政法大学金融学院

本文编辑:王   彤

技术总编:戴   雯

Python云端课程来啦!

      寒雪梅中尽,春风柳上归。新的一年,正值开学之际,为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!原价2400元的Python编程培训课程,现在仅需100元即可通过腾讯课堂参与学习。详细培训大纲及报名方式请查看推文Python云端课程福利大放送!0基础也能学~或点击文末阅读原文直接报名呦~另外,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

01


导言

我们在日常的数据处理工作中,经常会面临清洗字符型数据的问题,比如从"01Sep2020"这样的字符串中提取后四位数年份和从“湖北省武汉市洪山区中南财经政法大学”中提取出省份。解决诸如此类问题,最基础的方法就是使用字符串函数。本文将介绍一些重要的字符串函数,这些字符串函数实现了查找提取替换字符串这三大功能。

02


字节与字符

在介绍字符串函数之前,我们需要区分一下字节和字符。字节(byte)是一种计算机信息技术,用于计算存储容量的计量单位;字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号,如“1”、“A”、“¥”、“大”、“+”。不同形式的字符可能占据不同的字节数。而且,在不同编码下,同一字符占据的字节数也可能不同。
从Stata14开始,使用UTF-8编码。当字符在标准ASCII编码(下图给出了128个标准ASCII编码)的范围时,如英文字母和阿拉伯数字,都只占据一个字节。而UTF-8编码中超出标准ASCII编码范围的字符都是占据两个及两个以上字节,比如下表中不包括的中文标点符号和基础汉字,均占据3个字节。

在Stata中,使用strlen()函数能够统计字符串的字节长度;而使用ustrlen()函数统计的是字符串的字符数,这里的u代表的是Unicode编码。我们可以使用strlen()函数ustrlen()函数分别查看一下常用字符所占据的字节数和字符数。
disp strlen("Stata&Python") //单个英文字母和英文标点占据1个字节
disp ustrlen("Stata&Python") //ustrlen()函数建立在Unicode编码的基础上,任何符号都只算一个字符。
disp strlen("爬虫俱乐部,将爬虫进行到底!") //UTF-8编码下,单个汉字和中文标点符号占据3个字节
disp ustrlen("爬虫俱乐部,将爬虫进行到底!")

接下来将按功能分类介绍三个字符串函数,每个字符串函数的区别在于以s开头的字符串函数基于字节以u开头的字符串函数基于Unicode编码下字符。若待处理字符串超出了标准ASCII编码的范围,以u开头的字符串函数更适用。

03


字符串查找

1.strpos(s1,s2)
strpos(s1,s2)用来返回字符串s2在字符串s1中首次出现的位置(第几个字节处)。如果在字符串s1中找不到s2,返回0;如果字符串s2为空,则返回1。
我们可以构造一个含三行观测值的数据来体会一下strpos()的用法:
clear all
set obs 3
gen v="the world is beautiful"
replace v="the world" in 2
replace v="the word is beautiful" in 3
原始数据集如下所示:

drop if strpos(v,"is")==0 //删除不含有字符串"is"的观测值
keep if strpos(v,"word") //保留含有字符串"word"的观测值
最终数据集如下:

2. ustrpos(s1,s2[,n])
strpos()函数相比,ustrpos()函数名称多了一个"u",即Unicode编码。因此,和strpos()不同,ustrpos()在字符串s1中首次查找到字符串s2后,返回的是其处于第几个字符处,而不是字节处。此外,ustrpos()函数多了一个选项n:若n>0,则会从字符串s1的第n个字符开始搜索字符串s2;若n<0,则会从字符串s1的倒数第n个字符开始搜索字符串s2。举例来看:
disp strpos("爬虫俱乐部","虫") //返回4:单个汉字占据3个字节
disp ustrpos("爬虫俱乐部","虫") //返回2
disp ustrpos("爬虫俱乐部会爬虫","虫") //返回2:字符串中出现2次“虫”,首次出现位于第2个字符处
disp ustrpos("爬虫俱乐部","虫",4) //返回0:从第四个字符开始查找,因此查找不到

04


字符串提取

1.substr(s,n1,n2)
substr(s,n1,n2)用于提取字符串s的某个子字符串。n1表示从第n1个字节处开始提取,n2表示需要提取的子字符串所占字节的长度。如果n1<0,则从字符串倒数第n1个字节处开始提取;如果n2=.(缺失值),则从s的第n1个字节提取到最后一个字节,举例来看:
clear all
set obs 1
gen v="abcdefg"
gen v1=substr(v,3,2) //从字符串v的第3个字节处开始提取,提取2个字节的长度
gen v2=substr(v,-3,2) //从字符串v的倒数第3个字节处开始提取,提取2个字节的长度
gen v3=substr(v,-3,.) //从字符串v的倒数第3个字节处开始提取,提取至最后1个字节
gen v4=substr("爬虫俱乐部",4,3) //从“爬虫俱乐部”的第4个字节处开始提取,提取3个字节的长度,一般情况下一个汉字的长度为3个字节
最终数据集如下:

2.usubstr(s,n1,n2)
usubstr(s,n1,n2)也是用于提取字符串s的某个子字符串。但n1表示从第n1个字符处提取,n2表示提取长度为n2个字符的子字符串。举例来看:
clear all
set obs 1
gen v="第29届夏季奥林匹克运动会于2008年8月8日晚上8时整在中华人民共和国的首都北京举办。"
gen city=usubstr(v,-5,2) //-5表示从倒数第5个字符处开始提取
结果如下:

05


字符串替换

subinstr(s1,s2,s3,n) 和 usubinstr(s1,s2,s3,n) 函数用于替换子字符串,将字符串s1中的前n个子字符串s2替换成字符串s3,如果n为“.”,字符串s1中包含的s2字符串会被全部替换为s3。两者区别同上述函数,前者基于字节,后者基于字符。以subinstr()函数为例,我们来体会一下用法:
clear all
set obs 1
gen v="This is an island"
gen v1=subinstr("This is an island","is","X",1)
gen v2=subinstr("This is an island","is","X",2)
gen v3=subinstr("This is an island","is","X",.)
最终数据集如下:

今天关于字符串函数的介绍到这里就结束了!掌握查找、提取、替换三大功能就能完成一些基本字符型数据的处理工作啦,更复杂的数据处理问题请持续关注我们的推文!欢迎大家下方留言提问,喜欢的话帮忙点个“在看”吧~

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!


往期推文推荐
物以类聚——浅述k-means聚类算法

我在哪里?调用高德API获取地址经纬度信息

超级简单的条件函数,轻松生成虚拟变量

Python云端课程福利大放送!0基础也能学~

【爬虫实战】“我们,继续新故事”——爬取LOL英雄皮肤

“人像动漫化”—Python实现抖音特效

跨框架合并数据|frlink的用法,你get到了吗

《唐探3》做错了什么?|来自150万字影评的证据

爬虫俱乐部年度总结|《请回答2020》

春节假期临近,来爬爬豆瓣看看有什么好剧
putdocx生成Word文档so easy!

模糊匹配我只用这一招!

利用tushare获取财务数据

爬虫实战|Selenium爬取微信公众号标题与链接

轻轻一点,就知有没有|rqrs命令介绍

强大的正则表达式

自动群发邮件(二)——附带附件

自动群发邮件--email和smtplib基本模块的使用

批量处理变量名和标签的小方法

计算工作日的小能手——workdays

Seminar | 企业错报与银行贷款合同

Seminar | 共同基金行业的性别歧视
Seminar | 来自女儿的塑造:高管、女性社会化与企业社会责任

小贴士:Markdown的基本语法

听说相貌也能量化 | 调用百度人脸检测API实现颜值打分

列出指定属性的变量|findname命令比ds命令

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



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

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




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

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