我们在做数据清理时经常会遇到字符型变量的清理问题,Stata提供了大量、功能强大的字符函数,灵活运用字符函数可以高效、快速、精确、准确地清理数据。本文为大家介绍一些常用的Stata 字符函数。其中s 代表字符集,包括字符串、字符型变量或者其他字符表达式,n 代表数值子表达式,包括数字、字符型变量或者其他数值表达式。1. 字符串的缩写与扩展

abbrev(s,n):适用于所有字符型变量,功能是对s进行缩写,缩写的长度为n,n的取值范围为5-32

示例:

abbrev("displacement", 8) = “displa~t”

abbrev("北京市海淀区", 8) = “北京~区”

strcat(s1,s2):合并s1、s2。Stata里没有strcat()函数,用加号实现字符之间的连接。

示例:

"hello" + "world" = "hello world"

"a"+ "b" = "ab"

"北京市 " + "海淀区" = "北京市海淀区"

strdup(s1,n):创建n个s1的副本并合并。Stata里没有strdup()函数,用乘号实现字符的多次复制。

示例:

"hello"* 3 = "hellohellohello"

0 * "hello" = ""

"北京市"* 2 = "北京市北京市"

 

2. 字符串的截取

substr(s,n1,n2):从s中第n1个字符开始截取n2个字符。如果n2缺失,则从第n1个字符开始截取所有字符。如果n1<0,则从s字符的倒数第n1个字符处开始截取。

示例:

substr("abcdef",2,3) = "bcd"

substr("abcdef",-3,2) ="de"

substr("abcdef",2,.) = "bcdef"

substr("abcdef",-3,.) ="def"

usubstr(s,n1,n2):从s中第n1个字符开始截取n2个字符。如果n2缺失,则从第n1个字符开始截取所有字符。如果n1<0,则从s的倒数第n1个字符处开始截取。适用于Unicode编码。

 示例:

usubstr("北京市海淀区",4,3) = "海淀区"

usubstr("北京市海淀区",-3,3) = "海淀区"

usubstr("北京市海淀区",4,.) = "海淀区"

ustrleft(s,n):截取s的前n个字符。适用于Unicode编码。

示例:

ustrleft("北京市海淀区",3) = "北京市"

ustrright(s,n):从s的结尾处开始截取n个字符。适用于Unicode编码。

示例:

ustrright("北京市海淀区",3) = "海淀区"

word(s,n):截取s中第n个单词。当n是缺失时,截取的结果也是缺失。当n>0时,从字符s左边开始截取;当n<0时,从字符右边开始截取。

示例:

word(“thisis a happy day”, 2) = "is"

word(“this is a happy day”, .) = ""

word(“北京市, 3) = "市"

word(“北京市, 3) = "

 

3. 字符串的替换

 

plural(n,s):可以将s变为复数。当n的取值不是+/-1,plural就给s添加后缀“s”。

示例:

plural(1,"horse") = "horse"

plural(2, "") = "horses"

plural(n,s1,s2):可以给s1添加删减后缀。当n的取值不为+/-1时,如果s2前有“+”,添加s2至s1后面;若s2前有“-”,在s1中去掉s2;如果s2前没有“+/-”,s2替换s1

示例:

plural(2,"glass", "+es") = "glasses"

plural(2, "abcdefg","-efg") = "abcd"

plural(2, "mouse","mice") = "mice"

plural(1, "mouse","mice") = "mouse"

plural(2, "北京市", "+海淀区") = "北京市海淀区"

plural(2, "北京市海淀区","-海淀区") = "北京市"

regexr(s1,re,s2):判断s1中是否有符合re表达式的字符,如果有,用s2替换s1中满足re条件的第一个字符串,否则,返回s1。适用于ASCII编码。

示例:

regexr(“小明是学生”,”小”,”大”) = ”大明是学生”

regexr(“小明是小学生”, ”小”,”大”) = ”大明是小学生”

regexr(“大明是学生”, ”小”,”大”) = ”大明是学生”

ustrregexrf(s1,re,s2[,noc]):用法同regexr,增加选项noc。如果不指定noc非0,就不区分大小写。适用于Unicode编码。

示例:

ustrregexrf("this       is", "is", "X") = "thX is"

ustrregexrf("THIS is ", " Is","X") = " THIS is"

ustrregexrf("THIS is ", " Is","X", 1) = "THX is"

ustrregexra(s1,re,s2[,noc]):用s2替换s1中符合re表达式的所有字符。当指定选项noc不为0时,不区分大小写。适用于Unicode编码。

示例:

ustrregexra("this      is", "is", "X") ="thX X"

ustrregexra("THIS is","Is", "X") = " THIS is"

ustrregexra("THIS is", "Is","X", 1) = "THX X"

subinstr(s1,s2,s3,n):将s1中前n次出现的s2替换成s3。如果指定n为缺失“.”,则s1中所有的s2字符全部被替换成s3。

示例:

subinstr("thisis the day","is","X",1) = "thX is the day"

subinstr("this is the hour","is","X",2) ="thX X the hour"

subinstr("this isthis","is","X",.) = "thX X thX"

usubinstr(s1,s2,s3,n):将s1中前n次出现的s2替换成s3。如果指定n为缺失“.”,则s1中所有的s2全部被替换成s3。适用于Unicode编码。

示例:

subinstr("北京市海淀区海淀路","海淀","朝阳",1) = "北京市朝阳区海淀路"

subinstr("北京市海淀区海淀路","海淀","朝阳",.) = "北京市朝阳区朝阳路"

subinword(s1,s2,s3,n):将s1中前n次出现的单词s2替换成s3。如果指定n为缺失“.”,则s1中所有的单词s2全部被替换成s3。

示例:

subinword("thisis the day","is","X",1) = "this X the day"

subinword("this is thehour","is","X",.) = "this X the hour"

subinword("this isthis","th","X",.) = "this is this"

 

4. 删除字符串中的空格


stritrim(s):将s中字符之间的连续多个空格删除至一个空格。无法去掉s字符串开头处和结尾处的空格。

示例:

stritrim("hello   there") ="hello there"

stritrim("北京市        海淀区") = "北京市海淀区"

strltrim(s): 去掉s开头处的空格。

示例:

strltrim("  this") = "this"

strltrim("  北京市") ="北京市"

strrtrim(s):去掉s结尾处的空格。

示例:

strrtrim("this") = "this"

strrtrim("北京市  ") = "北京市"

strtrim(s):去掉s开头处和结尾处的空格。

示例:

strtrim("    this ") = "this"

strtrim("    北京市   ") = "北京市"

 

5. 字符型与数值型的转换

real(s):将s转换为数字或者缺失。

示例:

real("5.2")+1 = 6.2

real("hello") = .

real("北京市") = .

strofreal(n):将数值n转为字符。

示例:

strofreal(4)+"F" = "4F"

strofreal(1234567) = "1234567"

strofreal(12345678) = "1.23e+07"

strofreal(.) = "."

strofreal(n,s):将数值n按照s规定的显示格式显示。

示例:

strofreal(4,"%9.2f") = "4.00"

strofreal(123456789,"%13.0gc") = "123,456,789"

strofreal(0,"%td") = "01jan1960"

strofreal(225,"not a format") = ""