有没有什么办法计数字符串中的空格数量?字符串首尾都没有空格, 比如 : “a b” 这其中有1个空格,”a b c” 这其中有2个空格。
读取演示数据,Stata命令如下:
* Example generated by -dataex-. For more info, type help dataex
clear
input str15 var1
"a"
"a b"
"a b c d"
"a b c d e f"
"a b c d e f g h"
"a b c"
"a b c d"
"a b"
"a"
"a b c d e f"
end
因为要调用Stata社区命令egenmore,所以需要先安装,安装的Stata命令如下:
* 连接服务器可能比较慢,请耐心等待,或查看如何加速
ssc install egenmore,replace
生成变量包含空格的数量,将其赋值为num1,Stata命令如下:
*nss(strvar) , find(substr) [ insensitive ]
egen num1=nss(var1),find(" ")
list
上述命令说明:nss(strvar) , find(substr) [ insensitive ] returns the number of occurrences of substr within the string variable strvar. insensitive makes counting case-insensitive. (Stata 6 required.)
egenmore还有个选项可以实现类似的功能,我们再生成一个变量num2,Stata命令如下:
*noccur(strvar) , string(substr)
egen num2=noccur(var1),string(" ")
list
上述命令说明:noccur(strvar) , string(substr) creates a variable containing the number of occurrences of the string substr in string variable strvar. Note that occurrences must be disjoint (non-overlapping): thus there are two occurrences of “aa” within “aaaaa”. (Stata 7 required.)
更多功能,可以help egenmore查看。
如果不想使用Stata社区命令,当然可以纯手工实现,将其赋值为num3,Stata代码如下:
*循环中的字符串函数subinstr()的功能也可以用regexr()实现
tempvar Lian1 Lian2
gen `Lian1' = var1
gen `Lian2' = var1
gen num3 = 0
quietly while 1 {
replace `Lian1' = subinstr(`Lian1', " ", "", 1)
capture assert `Lian1'==`Lian2'
if _rc {
replace num3 = num3 + (`Lian1'!=`Lian2')
replace `Lian2' = `Lian1'
}
else continue, break
}
解读命令:假如字符是”a b c”,则该循环执行顺序是”a b c”→”ab c”→”abc”。如第一步是去掉该特定字符(本例中是一个空格)并赋值给临时变量Lian1,然后判断临时变量Lian1是否等于Lian2,若不等数量+1,将临时变量Lian1的值赋给Lian2,继续循环,直至临时变量Lian1等于Lian2。(`Lian1!=`Lian2′)的意思是若两者不相等,返回值为1,否则返回值为0。
最后用list命令查看一下,可以看出3种方法的结果(num1、num2和num3)是一致的。
完,本文内容交流请移步:http://www.epiman.cn/thread-152449-1-1.html