将一位数转换为两位数
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_1
、hou_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
我目前正在 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_1
、hou_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