根据可能存在于多个其他变量中的值创建新的 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,即使它是 Z33Z4001 或任何其他以 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 |
     +--------------------------------------------------------------------------------+