根据可能存在于多个其他变量中的值创建新的 Stata 变量
Create new Stata variable based on value that might be present in multiple other variables
需要根据可能出现在 5 个“响应”变量之一中的条目在 Stata 中创建一个新的二进制变量。
现有数据示例:
Resp1 Resp2 Resp3 Resp4 Resp5
A57 A510 B899 Z781 Q56883
A110 A4589 B11345 Z570 D444
A510 B899 Z4721 Z33 M406
B890 B678 T4487 A57 T112
A57 T112 B890 M119 Z4001
我想做的是:
generate byte A57_Response = 0
replace A57_Response = 1 if Resp1 == "A57" & substr(Resp1, 3, 1) != "2"
replace A57_Response = 1 if Resp2 == "A57" & substr(Resp2, 3, 1) != "2"
replace A57_Response = 1 if Resp3 == "A57" & substr(Resp3, 3, 1) != "2"
replace A57_Response = 1 if Resp4 == "A57" & substr(Resp4, 3, 1) != "2"
replace A57_Response = 1 if Resp5 == "A57" & substr(Resp5, 3, 1) != "2"
有没有办法一次搜索所有 5 个 Resp 变量?
此外,有没有办法在不写出整个响应的情况下为新的二进制变量 generate
a 1
?例如,每次出现 Z
代码时分配一个 1
,即使它是 Z33
、Z4001
或任何其他以 Z
开头的可能代码?因为我使用的是 " "
,所以我知道它目前正在寻找完全匹配的大小写,但是有其他选择吗?
如果一个字符串变量等于 "A57"
那么它的第三个字符不是 "2"
的条件是多余的:它的第三个字符总是 "7"
.
代码现在只是
gen wanted = inlist("A57", Resp1, Resp2, Resp3, Resp4, Resp5)
其中一个变量以"Z"
开头的条件是
gen desired = 0
forval j = 1/5 {
replace desired = 1 if substr(Resp`j', 1, 1) == "Z"
}
第二个问题不需要循环,因为它也可以写成使用 inlist()
的计算。
编辑在您的示例中,Z
永远不会作为第二个或后面的字符出现,因此测试 Z
的任何出现都不会有误报的风险:
* Example generated by -dataex-. To install: ssc install dataex
clear
input str7 Resp1 str5 Resp2 str8 Resp3 str5 Resp4 str6 Resp5
"A57" "A510" "B899" "Z781" "Q56883"
"A110" "A4589" "B11345" "Z570" "D444"
"A510" "B899" "Z4721" "Z33" "M406"
"B890" "B678" "T4487" "A57" "T112"
"A57" "T112" "B890" "M119" "Z4001"
end
egen Resp = concat(Resp?), p(" ")
gen wanted = strpos(Resp, "Z") > 0
list
+--------------------------------------------------------------------------------+
| Resp1 Resp2 Resp3 Resp4 Resp5 Resp wanted |
|--------------------------------------------------------------------------------|
1. | A57 A510 B899 Z781 Q56883 A57 A510 B899 Z781 Q56883 1 |
2. | A110 A4589 B11345 Z570 D444 A110 A4589 B11345 Z570 D444 1 |
3. | A510 B899 Z4721 Z33 M406 A510 B899 Z4721 Z33 M406 1 |
4. | B890 B678 T4487 A57 T112 B890 B678 T4487 A57 T112 0 |
5. | A57 T112 B890 M119 Z4001 A57 T112 B890 M119 Z4001 1 |
+--------------------------------------------------------------------------------+
需要根据可能出现在 5 个“响应”变量之一中的条目在 Stata 中创建一个新的二进制变量。
现有数据示例:
Resp1 Resp2 Resp3 Resp4 Resp5
A57 A510 B899 Z781 Q56883
A110 A4589 B11345 Z570 D444
A510 B899 Z4721 Z33 M406
B890 B678 T4487 A57 T112
A57 T112 B890 M119 Z4001
我想做的是:
generate byte A57_Response = 0
replace A57_Response = 1 if Resp1 == "A57" & substr(Resp1, 3, 1) != "2"
replace A57_Response = 1 if Resp2 == "A57" & substr(Resp2, 3, 1) != "2"
replace A57_Response = 1 if Resp3 == "A57" & substr(Resp3, 3, 1) != "2"
replace A57_Response = 1 if Resp4 == "A57" & substr(Resp4, 3, 1) != "2"
replace A57_Response = 1 if Resp5 == "A57" & substr(Resp5, 3, 1) != "2"
有没有办法一次搜索所有 5 个 Resp 变量?
此外,有没有办法在不写出整个响应的情况下为新的二进制变量 generate
a 1
?例如,每次出现 Z
代码时分配一个 1
,即使它是 Z33
、Z4001
或任何其他以 Z
开头的可能代码?因为我使用的是 " "
,所以我知道它目前正在寻找完全匹配的大小写,但是有其他选择吗?
如果一个字符串变量等于 "A57"
那么它的第三个字符不是 "2"
的条件是多余的:它的第三个字符总是 "7"
.
代码现在只是
gen wanted = inlist("A57", Resp1, Resp2, Resp3, Resp4, Resp5)
其中一个变量以"Z"
开头的条件是
gen desired = 0
forval j = 1/5 {
replace desired = 1 if substr(Resp`j', 1, 1) == "Z"
}
第二个问题不需要循环,因为它也可以写成使用 inlist()
的计算。
编辑在您的示例中,Z
永远不会作为第二个或后面的字符出现,因此测试 Z
的任何出现都不会有误报的风险:
* Example generated by -dataex-. To install: ssc install dataex
clear
input str7 Resp1 str5 Resp2 str8 Resp3 str5 Resp4 str6 Resp5
"A57" "A510" "B899" "Z781" "Q56883"
"A110" "A4589" "B11345" "Z570" "D444"
"A510" "B899" "Z4721" "Z33" "M406"
"B890" "B678" "T4487" "A57" "T112"
"A57" "T112" "B890" "M119" "Z4001"
end
egen Resp = concat(Resp?), p(" ")
gen wanted = strpos(Resp, "Z") > 0
list
+--------------------------------------------------------------------------------+
| Resp1 Resp2 Resp3 Resp4 Resp5 Resp wanted |
|--------------------------------------------------------------------------------|
1. | A57 A510 B899 Z781 Q56883 A57 A510 B899 Z781 Q56883 1 |
2. | A110 A4589 B11345 Z570 D444 A110 A4589 B11345 Z570 D444 1 |
3. | A510 B899 Z4721 Z33 M406 A510 B899 Z4721 Z33 M406 1 |
4. | B890 B678 T4487 A57 T112 B890 B678 T4487 A57 T112 0 |
5. | A57 T112 B890 M119 Z4001 A57 T112 B890 M119 Z4001 1 |
+--------------------------------------------------------------------------------+