查看原文
其他

解放双手!你必须要会的两个命令—inlist & inlist2

爬虫俱乐部 Stata and Python数据分析 2023-01-01

本文作者:喻淑敏,中南财经政法大学统计与数学学院

本文编辑:魏若芙

技术总编:戴   雯


Stata&Python云端课程来啦!

     为了平衡团队运营成本,维系公众号的运营,也与国内动辄数千元的Stata课程缩短差距,我们的网课不得不上调价格,我们决定于2022年5月15日起调价,Python课程的价格调整为439.9元Stata基础课程调为439.9元Stata进阶课程调整到439.9元。大家可以告知一下身边想要购买的小伙伴,欲购从速哦,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言~我们在这篇推文提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

导读

在实证分析中,虚拟变量应用较为广泛且相对简单。尽管如此,生成虚拟变量仍有诸多细节需要注意,否则会导致虚拟变量存在偏差或者工作量巨大。当选择数据的条件过多时,使用Stata进行编程的过程中,用if语句写条件时,我们常常需要大量重复语句。而inlistinlist2命令出现,能够有效地避免赘述条件,达到解放双手的效果。为此,本文将从实例出发,分方法就如何生成虚拟变量进行简要介绍,以帮助大家对Stata 生成虚拟变量的要点及注意事项有更好的理解。

1、应用背景
在清洗数据过程中,我们经常需要对变量进行重新赋值。例如,基于我国32个省市自治区定义 east、midlle、west 三个虚拟变量。针对上述问题,常用方法是通过if条件语句对变量赋值。但是当类别较多时,if 命令语句将十分繁琐。为此,本文将介绍两个新命令 inlist 和 inlist2,以试图更加高效简洁地处理这些工作。
2、命令介绍
(2.1 inlist命令)


inlist具体语法如下:
命令语法
inlist(z,a,b,...)
具体用法
当 z 满足 a,b,... 中的任何一个,则返回值为 1,否则为0。
参数要求
所有参数必须是实数或者字符型数据,其中数值型参数的个数需要在 2~250 之间,字符型参数个数需在 2~10 个之间,并且字符型的每个参数需要加引号""。
适用数据
所有实值或者字符串
返回值
1或0
(2.2  inlist2命令)
命令语法inlist2 varname [, options]
语法解析
其中,varname 为需要处理的变量,类似于 inlist 命令中的 z。option 主要包括以下选项:
values(a,b,c,...):所有参数必须是实数或者字符串。如果是字符串,需要区分大小写,且字符串中不能包含逗号;
name(string):生成一个新的变量,默认变量名是 inlist2,也可通过改变string进行赋予新变量名。
具体用法
当varname满足a,b,...中任何一个,则生成一个新变量name(string),且其返回值为1,否则为0。
(
2.3  inlist2在inlist上的改变)
  • 首先,inlist系统自带,无需安装;inlist2需先安装再使用,安装代码如下:
    ssc install inlist2, replace //安装命令ssc des inlist2 //程序包介绍
  • 其次,在 inlist2 命令中,字符串类型的参数不需要用引号 " " 括起来;inlist中引号必须存在;

  • 再者,inlist2没有10个参数的限制字符串或实值的250个参数的上限限制

  • 此外,inlist2自动区分变量是实数还是字符串,但不允许在字符串值中使用逗号

  • 最后,inlist2命令运行后会生成一个新的变量,返回值仍为 0 或 1。

3、案例展示

我们想要将全国32个省市自治区划分为东中西部,手动输入包含32个省市自治区的数据文件并保存,代码如下:

clearinput str21 province"北京"            "福建"            "广东"            "广西""海南"            "河北"            "江苏"            "辽宁"            "山东"            "上海"            "天津"            "浙江"            "安徽"            "河南"            "黑龙江"         "湖北"            "湖南"            "吉林"            "江西"            "内蒙古"   "山西"            "甘肃"            "贵州"            "宁夏""青海"            "陕西"            "四川"            "西藏"      "云南"            "重庆" "台湾" "新疆"          endsave "inlist_inlist2", replace //保存数据
3.1 具体方法
(
if法)
gen east_1 = 0gen west_1 = 0gen middle_1 = 0replace middle_1 =1 if prov=="安徽" | prov=="河南" | prov=="黑龙江" | prov=="湖北" | prov=="湖南" | prov=="吉林" | prov=="江西" | prov=="内蒙古" | prov=="山西"replace west_1 =1 if prov=="甘肃" | prov=="贵州" | prov=="宁夏" | prov=="青海" | prov=="陕西" | prov=="四川" | prov=="西藏" | prov=="云南" | prov=="重庆" | prov=="新疆"replace east_1 =1 if prov=="天津" | prov=="北京" | prov=="上海" | prov=="广东" | prov=="福建" | prov=="山东" | prov=="台湾" | prov=="浙江" | prov=="辽宁" | prov=="江苏" | prov=="河北" | prov=="海南" | prov=="广西"
对上述语句的简化:将上述两句合并为一句命令


gen middle_2 =(prov=="安徽" | prov=="河南" | prov=="黑龙江" | prov=="湖北" | prov=="湖南" | prov=="吉林" | prov=="江西" | prov=="内蒙古" | prov=="山西")gen west_2 =(prov=="甘肃" | prov=="贵州" | prov=="宁夏" | prov=="青海" | prov=="陕西" | prov=="四川" | prov=="西藏" | prov=="云南" | prov=="重庆" | prov=="新疆")gen east_2 =(prov=="天津" | prov=="北京" | prov=="上海" | prov=="广东" | prov=="福建" | prov=="山东" | prov=="台湾" | prov=="浙江" | prov=="辽宁" | prov=="江苏" | prov=="河北" | prov=="海南" | prov=="广西")(
inlist法)
gen middle_3 =inlist(province, "安徽", "河南", "黑龙江", "湖北", "湖南", "吉林", "江西", "内蒙古", "山西")gen west_3 =inlist(province, "甘肃", "贵州", "宁夏", "青海", "陕西", "四川", "西藏", "云南", "重庆", "新疆")gen east_3 =inlist(province, "天津", "北京", "上海", "广东", "福建", "山东","台湾","浙江","辽宁","江苏","河北","海南","广西")但这种定义方法有个很大的限制,即枚举的省份个数不能超过十个。因此生成west_3与east_3变量的命令语句出现报错。

想要解决因字符串参数数目限制的问题,想到能引入一个数值变量,用以标记省份名称,进而将每个省份的数字编码放到inlist()函数的列表中充当实值参数。毕竟,inlist()函数最多可以接受 250 个实值参数,需要注意的是,此方法的局限在于当数据量超过250时是失效的。具体做法如下:step1:生成一个数值变量prov_num,用以标记省份名称
encode province, gen(prov_num) label(prov_num) //prov变量的「数字-文字对应表」,并将其数值编码存储在新变量prov_num中label list prov_num //打印prov变量的「数字-文字对应表」prov变量的「数字-文字对应表」如下:

step2:把每个省份的数字编码放到 inlist() 函数的列表中,此时使用inlist命令定义虚拟变量:
gen middle_4 = inlist(prov_num, 3,6,10,12,17,19,22,23,32)gen west_4 = inlist(prov_num, 2,7,9,15,24,26,27,29,30,31)gen east_4 = inlist(prov_num, 1,4,5,8,11,13,14,16,18,20,21,25,28)(
inlist2法)
inlist2 province,values(甘肃, 贵州, 宁夏, 青海, 陕西, 四川, 西藏, 云南, 重庆,新疆) name(west_5)inlist2 province,values(安徽, 河南, 黑龙江, 湖北, 湖南, 吉林, 江西, 内蒙古, 山西) name(middle_5)inlist2 province,values(北京,福建,广东, 广西, 海南, 河北, 江苏, 辽宁, 山东,上海, 天津, 浙江,台湾) name(east_5)replace east_5 = 0 if east_5==.replace west_5 = 0 if west_5==.replace middle_5 = 0 if middle_5==.

本文通过if、insistinsist2这三个命令,共设计出五种方法,下面比较这五种方法的划分结果:

list west*,noobs sep(5)list east*,noobs sep(5)list middle*,noobs sep(5)

由图可知,从中部地区的来看,五种方法的结果是完全相同的;同理,西部与东部地区的四种方法是完全相同的,其中方法三的两个相关变量存在缺失问题。在实际问题中,大家可以根据数据需要和自己的熟练程度自行选择命令和对应的方法哦~最后,祝大家五一快乐!
End最后,我们为大家揭秘雪球网(https://xueqiu.com/) 最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码







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














往期推文推荐

【基础篇】字符串之判断方法

Stata绘图系列——让你的直方图随心所欲

【爬虫篇】湖人无缘季后赛,球迷如何回应

客官,要来份四象限图吗?

Python实现简繁体转换

Stata与Python交互方法及数据传递

 “青铜”爬“王者”

 留下想要的变量,你会几种方法?

 Python:朋友圈配图,我承包了

 绘制全国祠堂密度地图

 如何使用Stata绘制一幅好看的柱状图?

【爬虫篇】基于selenium爬取美团评论

 双标的莱万——足球无关政治?!

 Stata处理重复值:duplicates

It's time to send a flower to your lover!        2021各省GDP新鲜出炉

 爬虫实战-采集全国各省疫情数据

 log——为你的操作保驾护航

 一行代码教你玩转emoji

 票房遇冷的春节档口碑冠军丨《狙击手》影评分析

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

        B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

关于我们 


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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


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

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