查看原文
其他

gen的再进化

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

本文作者:朱巧利

文字编辑:张馨月

技术总编:张计宝

导读



gen是我们在Stata中使用非常频繁的命令,它可以用来生成新的变量或跟随计算表达式,但仍然不能满足我们的需求。egen作为gen的扩展和深入,可以与多种函数组合使用,在往期系列推文《egen的花样用法(一)》、《egen的花样用法(二)》、《egen的花样用法(三)》中已经进行详细介绍。

虽然egen的用法已经很丰富了,但是它再一次进化了,这就是今天的主角——egenmore,它进一步丰富了egen的函数库,在文字处理方面的功能也大幅提高,在推文《egenmore藏功能——进制转换》中介绍过它的进制转换功能,今天小编就和大家一起来看看egenmore关于文字处理方面的一些其他用法。


egenmore的基本语法与egen相同:

egen [type] newvar = fcn(arguments) [if exp] [in range] [, options]

egenmore可简写为egen,可见两者本质相同。

(一)egenmore与incss  

incss(strvarlist), substr(substring) [ insensitive ]

incss用来寻找哪些变量含有我们想要的字符串,如果字符串变量列表(strvarlist)中任何一个变量内含有指定的子字符串(substring),则生成1,否则为0,其中insensitive选项表示不区分大小写。需要注意的是我们可以指定多个子字符串,但这些字符串是有顺序的。

举例如下:

clear //输入数据input str20 v "i love stata""i like python""Stata and python"end

如果我们想要找到含有stata的变量,程序如下:

egen stata = incss(v),sub(stata) i //不区分大小写

结果如下:

可以看到含有stata的变量为1,否则为0。

(二)egenmore与msub 
msub(strvar), find(findstr) [replace(replacestr) n(#) word]
表示将findstr的单词替换为字符串变量strvar中的replacestr的单词。

findstr和replacestr的单词由空格分隔或由“”绑定,即find(a b“c d”)包含三个单词,依次为“a”、“b”和“c d”,并且应该使用双引号“”来分隔任何包含一个或多个空格的单词。

findstr中的单词数应该等于replacestr中的单词数,但有如下两点需注意:

(1)可使用空的replacestr来指定删除;

(2) replacestr中只有单个单词表示findstr中的每个单词都将被该单词替换。

由于使用引号进行分隔,文字引号应包含在复合双引号中,如' " " "';默认情况下,所有findstr的单词都会改变,n(#)指定只更改前#次出现的单词;word指定只有在findstr中的单词作为单独的单词出现在strvar中时才替换它们。msub()的替换是按顺序进行的,其功能的实现依赖于内置函数subinstr()和subinword()。

举例如下:

clear input str20 str"A AB BAC""B A BCA"endegen newstr = msub(str), f(A B C) r(1 2 3) //A被1替换,B被2替换,C被3替换egen newstr1 = msub(str), f(A B C) r(1 2 3) n(1) //只更改第一次出现的A、B、Cegen newstr2 = msub(str), f(A B C) r(1) //A、B、C全部被1替换egen newstr3 = msub(str), f(A B) //A、B被删除egen newstr4 = msub(str), f(" ") //空格被删除egen newstr5 = msub(str), f(A) w //A单独作为一个单词时会被删除

结果如下:

(三)egenmore与ntos 

ntos(numvar), from(numlist) to(list of string values)

表示从一个数值型变量numvar生成一个字符型变量,将numlist中的每个数值映射到对应的字符串。需要注意每个列表中的元素数量必须相同,包含空格的字符串值应该用双引号“”分隔。没有被映射定义的值会生成为缺失值。

举例如下:

clearinput Grade12345endegen grade = ntos(Grade), from(1/5) to(Poor Fair Good "Very good" Excellent)

结果如下:

可以看到不同的数字都映射到了相应的字符串。ntos()函数的逆函数是ston(),ston()可以将相应的字符串映射为数字。

(四)egenmore与repeat 

repeat(), values(value_list) [ by(byvarlist) block(#) ]

生成一个重复的value_list序列。value_list的可以是一个数字列表,也可以是一组字符串值,它们被循环地分配给连续的观察值。block()应该以指定大小的块重复,默认值为1

举例如下:

clearset obs 12egen quarter1 = repeat(), v(1/4)egen quarter2 = repeat(), v(1/4) block(3)egen months = repeat(), v(`c(Months)')egen levels = repeat(), v(10 50 200 500)

结果如下:

从上面的介绍可以看到egenmore关于文字处理方面的功能还是很丰富的,除了本文介绍的几种外还有非常多的用法,大家赶紧探索起来吧!







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取
anythingtodate带你轻松处理日期
_variables介绍
查询12306车次信息
海外疫情仍严峻,劝君更在家中留
国外疫情怎么看?——实时新闻获真知

基于贝叶斯定理的算法——朴素贝叶斯分类

中国知网爬虫(CNKI) 批量下载PDF格式论文
sencode命令介绍
Ftools命令组之fisid命令和fsort命令介绍
“抽丝剥茧”,层层下分——机器学习基本算法之决策树

关于我们



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

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

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


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

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