本文作者:胡婧
文字编辑:王凯丽
技术总编:刘洪儒
有问题,不要怕!
点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
喜大普奔~爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
好消息:爬虫俱乐部隆重推出数据定制及处理业务啦,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部资深高级会员为您排忧解难!
用Stata对数据处理时,往往需要对变量名进行更改。一个简单的方法是用rename命令。比如,我们想将变量price更名为_price,只需要如下操作。
sysuse auto, clear
rename price _price


使用rename命令后,变量名“price”改成了“_price”。这种改变变量名的方法比较简便,但是在使用rename命令时往往会因为变量名中包含一些非法字符而导致Stata报错。
比如,若想要生成的新变量名中存在“~”这个非法字符,Stata就会报错,如下面的结果所示。

我们会好奇,那变量名中可以包含哪些字符呢?让笔者来告诉你吧。变量名中可以包含数字、unicode中包含的各国语言以及下划线符号“_”。
我们以中文、英文、韩文为例,对变量名进行更换。
rename _price 价格_p_가격1

我们成功地将_price变量更名为“价格_p_가격1”。即变量名中可以包含我们上面所阐述的字符。然而,设置新变量名时,并非每个人都会仔细核对新变量名中是否存在非法字符,而是在Stata报错时才去核对变量名的设定是否存在错误。这本不是特别大的问题,但在多次更改变量名都报错后,笔者想,是否有什么方法可帮我们自动把非法字符转化为合法字符呢?(非法字符是原变量名中存在非法字符,比如空格。)笔者灵机一动,想起了strtoname()函数和ustrtoname()函数。它们在处理变量名时会起到巨大的作用。
比如,我们想将excel文件中的数据转换成dta文件,而很多excel表格的表头往往包含一些非法字符。表头如下图中第一行内容。

所以在excel表格导入Stata时,直接将第一行设置成变量名极有可能会报错。为了避免这种情况,我们在将excel表格导入Stata后,先运用strtoname()函数或ustrtoname()函数对第一行中不能作为变量名内容的非法字符进行转换后,再将其作为变量名。
我们以一个简单的excel文件为例,看看strtoname()函数和ustrtoname()函数的神奇之处!
我们先将excel文件的内容导入到Stata中。
cd D:/推文
insheet using temp.csv, clear

根据导入后的数据可以看出,我们需要将第一行内容设定为变量名,这之前我们需要将第一行中(不能作为变量名内容的)非法字符利用strtoname()函数和ustrtoname()函数转换成合法字符,即下划线。然后利用rename命令将变量名转换为我们期望的变量名,并且删除第一行。
rename (v1 v2 v3) (`=ustrtoname("*firm")' `=strtoname("*supplierlist")' `=ustrtoname("*year")')
drop in 1
这里是利用strtoname()函数和ustrtoname()函数直接将字符串中非法字符转换为下划线。免去手工一个一个改,所以举了个小例子。

这样,变量名的替换就完成了。但有些读者可能并不了解strtoname()函数和ustrtoname()函数。下面由笔者来为你们答疑解惑吧!
我们先来help一下strtoname()函数和ustrtoname()函数。
help strtoname()

help ustrtoname()

1.strtoname()函数和ustrtoname()函数的语法结构
strtoname()函数和ustrtoname()函数均需要输入s和p两个参数。s为需要进行转换的字符串,p为可选参数,取值为0或1,缺省默认为1。s中不能作为变量名内容的非法字符将被转换成下划线;如果字符串s的第一个字符为数字字符并且p的取值不为零,则转换后数字字符前面加下划线。注意,s是字符串,运行时需要使用英文的双引号“”。
strtoname()函数和ustrtoname()函数的用法有很多相似的地方,也有细微的差别。我们先来看一下strtoname()函数和ustrtoname()函数用法相同的部分。


2.strtoname()函数和ustrtoname()函数的相同之处
strtoname()函数和ustrtoname()函数都是将字符串中的非法字符变成下划线”_”。当字符串的第一个字符为数字并且p的取值非0(或p缺省)时,这两个函数会自动在数字字符前面添加下划线”_”。当p取值为0时,则当字符串的第一个字符为数字字符时,生成的结果中第一个字符前面不加下划线。例如:
di ustrtoname("2:30")
di strtoname("2:30")

di ustrtoname("2:30",0)
di strtoname("2:30",0)

di ustrtoname("2:30",1)
di strtoname("2:30",1)

3.strtoname()函数和ustrtoname()函数的差异
strtoname()函数和ustrtoname()函数均对字符串s的长度有要求。需注意的是,strtoname()函数中s的最大限度是32个字节,但是对于Stata14可能是32个字符,而ustrtoname()函数中s的最大限度是32个字符,并且ustrtoname()函数只能在Stata14和Stata15版本中使用。这是因为Stata13版本以前没有内置unicode编码,而Stata14版本以后将unicode编码内置到了Stata系统内部。
di strtoname("爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 ") //按32个字节显示,一个汉字占3个字节,加上两个空格(空格占一个字节),共32个字节。

di ustrtoname("爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 爬虫俱乐部 ") //unicode编码,一个汉字占一个字符,一个空格占一个字符,共32个字符。

可能很多人对于不同符号所占字节数的多少不是很清楚,我来简单介绍一下字节。字节是计算机内部的存储空间单位。数字、英文、符号等均是一个字节的,而类似中文、韩文、日文等非英语语言文字则占3个字节,少量复杂的中文文字占4个字节。从上图中,我们可以看到strtoname()函数输出的结果中只能输出前32个字节的内容,而ustrtoname()函数则能输出前32个字符的内容。各位一定要注意字符和字节的区别哦!所以相比较而言,ustrtoname()函数可以一次转换更多的字符串。注意,Stata13版本以前的用户不能用ustrtoname()函数,只能用strtoname()函数。
以上就是strtoname()函数和ustrtoname()函数的全部内容了,各位在今后的数据处理中可以通过这两个函数来设置合法的变量名。
注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
你在变优秀呀
往期精选
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。
快
来
关
注
我
吖
!

