3

在我的数据集中,我有一堆是/否类型变量。出于某种原因,“是”被编码为 1,“否”被编码为 2 而不是 0。现在我想根据值标签“否”将 2 重新编码为 0。

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

有一些并发症:

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

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

4

1 回答 1

3

假设您正在寻找带有特定值标签的变量。您可以使用检索这些变量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 且附加了值标签“否”的变量。警告:这应该会更改您的数据集。确保您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 
       } 

  }
于 2015-05-14T16:55:58.767 回答