我有一个10位长的字符串“0000000000”,名为my_var
。我有两个变量highclass
(0到10之间)和lowclass
(0到10之间)。
我需要将highclass
和lowclass
之间的数字转换为1。
例如,如果某行highclass
= 5且lowclass
= 1,则my_var
应为1111100000。
我不确定substring命令是否会对我有所帮助,因为我需要引用一个变量。
答案 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"
完全合法,但评估为缺失(空字符串)。