Stata测试字符串是否包含相同字符

Stata test if string contains same character

我想自动测试字符串是否只包含一种类型的字符,结果在 true/false 变量“check”

input str11 contactno 
"aaaaaaaaaaa"
"bbbbbbbbbbb"
"aaaaaaaaaab"
end

我的尝试

gen check = .
//loop through dataset
local db =_N
forval x = 1/`db'{
dis as error "obs `x'"
//get first character in string
local f = substr(contactno, 1, 1) in `x' 
//loop through each character in string
capture drop check_*
forvalues i = 1/11 {
    quietly gen check_`i'=.
    local j = substr(contactno, `i', 1) in `x'

    //Tag characters that match
    if "`j'" == "`f'"  {
    local y = 1
    replace check_`i'= 1 in `x'
        } 
    else  {
    local y= 0
    replace check_`i'= 0 in `x'
    }
    
}

预期结果前两个观察结果应该是正确的,第三个观察结果应该是错误的。

这是另一种方法。

clear 
input str11 contactno 
"aaaaaaaaaaa"
"bbbbbbbbbbb"
"aaaaaaaaaab"
end

gen long id = _n
save original_data, replace 
expand 11 
bysort id : gen character = substr(contactno, _n, 1)
bysort id (character) : gen byte OK = character[1] == character[_N]
drop character 
bysort id : keep if _n == 1 
merge 1:1 id using original_data 

list 

     +-------------------------------------+
     |   contactno   id   OK        _merge |
     |-------------------------------------|
  1. | aaaaaaaaaaa    1    1   Matched (3) |
  2. | bbbbbbbbbbb    2    1   Matched (3) |
  3. | aaaaaaaaaab    3    0   Matched (3) |
     +-------------------------------------+

您可以在一行代码中实现这一点,如下所示:

  1. contactno的第一个字符。
  2. contactno 中查找该字符的所有实例并替换为空字符串(即“”)。
  3. 测试结果字符串是否为空。
gen check = missing(subinstr(contactno,substr(contactno,1,1),"",.))


     +---------------------+
     |   contactno   check |
     |---------------------|
  1. | aaaaaaaaaaa       1 |
  2. | bbbbbbbbbbb       1 |
  3. | aaaaaaaaaab       0 |
     +---------------------+

所以我们利用了这样一个事实,即如果所有字符都不等于第一个字符,那么字符串不能只包含一个(类型)字符。