将一位数转换为两位数

Convert one to many with 2 digits

我目前正在 Stata 中处理通过开放数据工具包 ODK 生成的数据集。 有一个选项可以回答具有多个答案的问题。例如。在我的问卷 "Which of these assets do you own?" 中,面试官标记了 20 个选项中的所有答案。 这为我生成了一个字符串变量,其内容如

 "1 2 3 5 11 17 20"
 "3 4 8 9 11 14 15 18 20"
 "1 3 9 11"

由于这很难对数百名参与者进行分析,我想生成新变量,为每个答案选项创建 1 或 0。 对于变量 hou_as,我尝试使用以下代码生成变量 hou_as_1hou_as_2 等:

foreach p in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 {
local P : subinstr local p "-" ""
gen byte hou_as_`P' = strpos(hou_as, "`p'") > 0
}

对于单个数字,这会带来一个问题,即使未选择选项 1,如果 10 11 12 ... 19 中的任何一个被填充,变量 hou_as_1 也会填充 1。同理,勾选选项2、12或20时,填入hou_as_2。 我怎样才能避免这个问题?

您需要 20 个指标或虚拟变量。首先请注意,使用 forval 循环 1(1)20 更容易,例如

forval j = 1/20 { 
    gen hou_as_`j' = 0
} 

初始化20个变量为0。

我认为循环你的答案变量的词更容易,这里的词只是用空格分隔的任何词。最多20个字,有点粗糙,不过应该够快了

forval j = 1/20 { 
    forval k = 1/20 { 
        replace hou_as_`j' = 1 if word(hou_as, `k') == "`j'" 
    }
} 

让我们把它放在一起并在您的示例中尝试一下:

clear 
input str42 hou_as 
 "1 2 3 5 11 17 20"
 "3 4 8 9 11 14 15 18 20"
 "1 3 9 11"
end 

forval j = 1/20 { 
    gen hou_as_`j' = 0
    forval k = 1/20 { 
        replace hou_as_`j' = 1 if word(hou_as, `k') == "`j'" 
    }
} 

只是为了证明它有效:

. list in 3 

     +----------------------------------------------------------------------------+
  3. |   hou_as | hou_as_1 | hou_as_2 | hou_as_3 | hou_as_4 | hou_as_5 | hou_as_6 |
     | 1 3 9 11 |        1 |        0 |        1 |        0 |        0 |        0 |
     |----------+----------+----------+----------+----------+----------+----------|
     | hou_as_7 | hou_as_8 | hou_as_9 | hou_a~10 | hou_a~11 | hou_a~12 | hou_a~13 |
     |        0 |        0 |        1 |        0 |        1 |        0 |        0 |
     |----------+----------+----------+----------+----------+----------+----------|
     | hou_a~14 | hou_a~15 | hou_a~16 | hou_a~17 | hou_a~18 | hou_a~19 | hou_a~20 |
     |        0 |        0 |        0 |        0 |        0 |        0 |        0 |
     +----------------------------------------------------------------------------+

顺便说一句,你的台词

local P : subinstr local p "-" ""

没有任何用处。本地宏 p 只包含整数数字的内容,因此根本没有要删除的标点符号。

另见 this explanation

. search multiple responses, sj

Search of official help files, FAQs, Examples, SJs, and STBs

SJ-5-1  st0082  . . . . . . . . . . . . . . . Tabulation of multiple responses
        (help _mrsvmat, mrgraph, mrtab if installed)  . . . . . . . .  B. Jann
        Q1/05   SJ 5(1):92--122
        introduces new commands for the computation of one- and
        two-way tables of multiple responses

SJ-3-1  pr0008   Speaking Stata: On structure & shape: the case of mult. resp.
        . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox & U. Kohler
        Q1/03   SJ 3(1):81--99                                   (no commands)
        discussion of data manipulations for multiple response data