【问题标题】:Recode A String Variable重新编码字符串变量
【发布时间】:2020-09-28 23:31:48
【问题描述】:
input VAR1 VAR2
A1 1
A2 0
A3 1
A4 1
A5 1
A6 1
A7 1
A8 1
A9 1
A10 1
A15 1
B7 0
A1 0
A16 1
A17 1
A18 1
A19 1
A20 0
A21 1
end

假设您有如图所示的数据。我有VAR1 并希望从中创建VAR2,如果VAR1 开头包含:A1、A3-A10、A15-A19、A21,则取值为 1,否则为零。我相信为此您可以使用strpos(VAR1),但是否可以说例如:strpos(VAR1, "A1, A3/A10, A15/A19, A21")

【问题讨论】:

    标签: string stata recode


    【解决方案1】:

    如果您有少量感兴趣的字符串,则以下方法有效。如果您要搜索大量字符串,则可能需要另一种方法,因为写出字符串的范围(例如 A3-A10)是不可行的。

    clear
    input str3 VAR1 VAR2
    A1 1
    A2 0
    A3 1
    A4 1
    A5 1
    A6 1
    A7 1
    A8 1
    A9 1
    A10 1
    A15 1
    B7 0
    A1 1
    A16 1
    A17 1
    A18 1
    A19 1
    A20 0
    A21 1
    end
    
    gen wanted = 0
    
    local mystrings = "A1 A3 A4 A5 A6 A7 A8 A9 A10 A15 A16 A17 A18 A19 A21"
    
    foreach string in `mystrings' {
        replace wanted = 1 if strpos(VAR1, "`string'") == 1
    }
    
    assert wanted == VAR2
    

    请注意,在您的示例输入中,第二次出现的 A1 的值为 0,但根据您的帖子,该值应为 1。

    对于更大范围的字符串,这是一个更通用的解决方案:

    gen     A = 0
    replace A = 1 if strpos(VAR1,"A") == 1
    
    gen newvar = substr(VAR1,2,.)
    destring newvar, replace
    
    gen wanted = 0
    replace wanted = 1 if A == 1 & (inlist(newvar,1,21) | inrange(newvar,3,10) | inrange(newvar,15,19))
    
    assert wanted == VAR2
    

    【讨论】:

    • 非常感谢,这很棒。但是,如果说我必须将 A01 到 A55 和 A59 到 A101 编码为 '1' 呢?在 Stata 中是否有可能只说:“A01/A55 | A59/A101”?而不是单独写一个?当字符串的范围真的很大时,您有什么建议吗?
    • 如果所有字符串都以单个字母开头,例如A,我建议使用substr 函数生成一个新变量,该变量包含相同的字符串但没有第一个字母(因此它只包含数字),然后使用destring 将该字符串转换为数字并使用类似的东西选择观察值replace wanted = 1 if inrange(newvar,59,101)。希望这是有道理的。
    • 没关系。我将使用一些示例代码编辑我的答案。
    • gen VARA = substr(VAR1, 1, 1)gen VARB = substr(VAR1, 2, .)
    • 你在 Statalist 上交叉发帖,如果不告诉别人,这不是一个好习惯。另外,请不要在 cmets 中提出新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2019-05-02
    相关资源
    最近更新 更多