【问题标题】:Stata Replacing Part of StringStata替换字符串的一部分
【发布时间】:2016-08-05 07:59:58
【问题描述】:

我有 10 位长字符串“0000000000”,称为my_var。我有两个变量 highclass(介于 0 和 10 之间)和 lowclass(介于 0 和 10 之间)。

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

例如,如果一行有highclass =5 和lowclass =1,那么my_var 应该变成1111100000。

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

【问题讨论】:

  • 变量名不能包含空格;它们可以包含下划线。我已将highclasslowclass 上的变体编辑为同名。如果我猜错了,您将需要更改代码。
  • 好的问题给出了可重复的数据示例,并显示了对代码的明确尝试。

标签: string stata


【解决方案1】:

据我了解,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 以上)

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

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

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

【讨论】:

    猜你喜欢
    • 2022-07-18
    • 2014-02-14
    • 2012-05-18
    • 2017-09-19
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多