Stata替换字符串的一部分

时间:2016-08-05 07:59:59

标签: string stata

我有一个10位长的字符串“0000000000”,名为my_var。我有两个变量highclass(0到10之间)和lowclass(0到10之间)。

我需要将highclasslowclass之间的数字转换为1。

例如,如果某行highclass = 5且lowclass = 1,则my_var应为1111100000。

我不确定substring命令是否会对我有所帮助,因为我需要引用一个变量。

1 个答案:

答案 0 :(得分:2)

据我了解,lowclass是第一个1的位置,highclass是最后一个1的位置。

不需要循环。实际上,单个陈述会在Stata(这是问题的语言)中做到。

两种方法:

旧式(特别与Stata 12及以下相关)

在这里,我将单个语句拆分为几个,因为我怀疑它更清晰。请注意,substr()(不是substring())是一个函数,而不是一个命令。

clear 
input str10 my_var lowclass highclass 
"0000000000"  1  5
"0000000000"  2  4
"0000000000"  3  3 
"0000000000"  1  10
"0000000000"  7  10 
end 

local zeros "0000000000"
local ones  "1111111111" 
replace my_var = substr("`zeros'", 1, lowclass - 1)
replace my_var = my_var + substr("`ones'", 1, highclass - lowclass + 1) 
replace my_var = my_var + substr("`zeros'", 1, 10 - highclass) 

list 

     +----------------------------------+
     |     my_var   lowclass   highcl~s |
     |----------------------------------|
  1. | 1111100000          1          5 |
  2. | 0111000000          2          4 |
  3. | 0010000000          3          3 |
  4. | 1111111111          1         10 |
  5. | 0000001111          7         10 |
     +----------------------------------+

新款式(Stata 13 up)

Mata和Stata 13 up允许字符串乘法,(例如10 * "1")所以这可行:

replace my_var = (lowclass - 1) * "0" + (highclass - lowclass + 1) * "1" + (10 - highclass) * "0" 

请注意,例如-1 * "0"完全合法,但评估为缺失(空字符串)。