为 Stata 中的所有变量重新编码相同的值模式

Recode the same value pattern for all variables in Stata

在我的数据集中,我有一堆 Yes/No 类型的变量。由于某种原因,"Yes" 被编码为 1,"No" 被编码为 2 而不是 0。现在我想根据值标签 "No".[=10= 将 2 重新编码为 0 ]

我怎样才能做到这一点而不必检查和重新编码每一个?

有一些并发症:

  1. 这些假人中的每一个都有一个共享假人名称的值标签,而不是共享 "yesno" 值标签。因此,我不能简单地遍历所有具有 "yesno" 值标签的变量。

  2. 这些假人中可能有保留代码(-1 表示不知道,-2 表示拒绝等)。由于这些保留代码,我认为重新编码的最佳方法是通过检查值标签,因为我确定 2 被标记为编号

假设您要查找带有特定值标签的变量。您可以使用 ds 检索这些变量并将它们的名称传递给 recode

. clear

. set obs 2
obs was 0, now 2

. forval j = 1/5 {
  2. gen y`j' = _n
  3. }

. label def yesno 1 yes 2 no

. label val y4 yesno

. label val y5 yesno

. ds, has(vall yesno)
y4  y5

. ret li

macros:
            r(varlist) : "y4 y5"

. recode `r(varlist)' (2 = 0)

之后值标签也需要调整:

. label def yesno 0 "No", modify 

编辑(根据@Heisenberg 的有用评论)

如果您使用一组以上的值标签,则需要对不同的值标签重复应用此方法,或者考虑使用另一个值标签。

这是一种更通用的方法,用于查找值为 2 且附加了值标签 "No" 的变量。警告:这应该会更改您的数据集。确保你 save 早期版本。

 ds, has(vall) 

 foreach v in `r(varlist)' { 

       local lbl : label (`v') 2 

       if `"`lbl'"' == "No" { 
             replace `v' = 0 if `v' == 2 
             local label : value label `v' 
             label def `label' 0 "No", modify 
       } 

  }