这篇推文同样来自于湖南大学的美女苏老师的问题。苏老师希望能将字符型变量
surname
为缺失的观测值全部删掉,但却出现了许多“钉子户”,总是无法剔除干净。笔者将数据用
unicode
命令转码后,导入
Stata14
,按照
surname
变量进行排序后,看到最后一条观测值的
surname
变量是缺失的。这就很奇怪了,因为
Stata14
对字符型变量按照
unicode
编码顺序进行排序,无论是缺失、半角空格、全角空格还是各种控制字符,排序后都应该是在汉字之前。事实也证明无论是替换掉空格还是用正则表达式替换掉控制字符,都起不到任何效果。
于是
我们
用
list
命令看了一下,有了新的发现。
list surname in -1
最后一条观测值居然是一个方框里面有对号的奇葩字符。我们直接复制下来当然可以删除掉,但是这样的字符是否只有这么一个?在样本量非常大的情况下,如果有好多个这样的字符呢?有没有什么办法去分析这个这个奇葩的字符呢?
在这里,我用了之前在原来的公众号上提取经纬度的推文中用到过的
percentencode
命令。这个命令来自于
William Matsuoka
的个人主页上,从上面找到了这个将字符转化为
url
中百分比编码的程序,并经过改造变成了这么一个命令。其实转化成的百分比编码,就是
utf8
的
16
进制编码。
这就是说,这个奇葩字符对应的
utf8
的十六进制编码是
EE
80 85
,如果转化成
unicode16
进制编码,就是
E005
。而
unicode
的
16
进制编码中
E000-F8FF
范围的
6400
个字符属于自行使用区域
(Private Use Zone)
这么一个奇葩范围。将
16
进制的编码转化为
10
进制的编码,我们可以通过
uchar
函数来看看这些奇葩的字符究竟是什么。
我们生成一个变量,下面都是这样的字符,可以看一下结果。
clear
set obs 10
gen v = ""
forvalues i = 1/10 {
replace v = "`=uchar(57343+`i')'" in `i'
}
edit
可以看到我们生成的字符在单元格内都无法显示,但是选中对应的单元格,上方还是可以看到字符。
对于前文中的数据,我们可以直接用
uchar
函数将这个观测值删除掉。
drop if surname == "`=uchar(57349)'"
我们要将这一类的字符剃干净可以做一个循环,这一类字符的
unicode
的
10
进制编码范围为
57344-63743
,为了防止遗漏,笔者建议还是将这些字符替换掉,之后再去空格,最终将缺失值删除掉,不然假如这个字符和空格同时出现在一个单元格,就会剔除不干净;而如果这个字符和我们要保留的汉字同时出现在一个单元格,用
index()
或
strpos()
函数就会把我们要保留的内容删除掉。
forvalues i = 57349/63743 {
replace surname = subinstr(surname,`"`=uchar(`i')'"',"",.)
}
小编看到那些奇葩的字符觉得那可能是
unicode
的
一种卖萌方式,通过推文的介绍我们便可以轻松将它们替换掉并删除缺失值,遇到相同问题的读者朋友不妨自己尝试操作一下。我们的团队也乐于帮助大家解决各种
问题,快来关注我们的公众号,希望通过我们的小推文让你爱上萌萌哒stata。今天已经是九月的最后一个工作日啦,小编乖乖坐等为祖国麻麻庆生,在此提前
祝大家国庆快乐,假期出行,注意安全~
我们团队原来的微信公众号是“数据处理援助中心”,现在正式搬家到“爬虫俱乐部”,欢迎关注。新的公众号开始,我们推出有问必答栏目,对您提出的问题,我们会尽力回答,并通过推文的形式进行发布。
我们也欢迎各位粉丝向公众号投稿。
(编辑 @徐苾雯)
欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱
:xueyuan19920310
@163.com
投稿要求
:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项
:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)如果大家遇到关于stata处理分析数据的问题,也可以给该邮箱写邮件,邮件名称为“提问”+“问题名称或者关键词”,我们会在后期的推文里给予解答。
长按二维码关注公众号