删除多余的值标签

Drop redundant value labels

我有一部分大数据集。许多变量包含值标签,但这些值不存在于这部分数据集中。我想从数据集中删除冗余值标签。我尝试使用各种方法在 Stata 中做到这一点,但没有成功。

显然这不起作用:

label drop X if X == 1 

添加文本:到目前为止,我提出了以下不完美的解决方案,因为我需要在未来一次又一次地重复这个练习:

第一(半手动):

fre var
di r(lab_valid);
label drop var;
label define var 1 "Label 1" 2 "Label 2" 3 "label 3", modify.

其次(X是需要保留的标签代码,问题是我有多个需要保留):

labellist var
local min = r(var_min)
local max = r(var_max)
forval i = `min'/`max' {
    if `i' != X {
        label define var `i' "", modify
    }
}

没有"apparently":那不是合法的代码,原则上什至没有意义。最多 label drop 删除命名标签,但标签的名称和它们所附加的任何变量的名称都不重合,除非您以这种方式进行设置。

这是可疑的:

  1. 在大多数情况下,Stata 不会使用大量内存存储值标签。价值标签的大部分要点是价值标签只需要存储一次。

  2. 这种问题似乎暗示价值标签在你出现之前就已经设置好了,每个价值都可能找到一个观察来坚持。这很可能是明智的想法。

这很危险:

  1. 相同的值标签可能用于多个变量,因此原则上您需要检查使用特定集合的所有变量。

  2. 您需要担心如果您 appendmerge 使用类似的数据集可能会发生什么。这可能会导致比你想要的更多的混乱。

  3. 不那么刺耳但也值得一提的是,不在数据中的值标签可能仍可用于图形目的。

所以,我不建议你的想法。您可以尝试对每个带有值标签的变量进行 decode,然后根据这些值进行 encode。但价值标签不一定按所需顺序排列。默认情况下 encode 会使用字母顺序,你最终会得到像 1 "Acceptable" 2 "Bad" 3 "Good"1 "Agree" 2 "Disagree" 3 "Neutral" 这样的废话。可以想象最终得到比开始时更多的标签。

还有其他方法可以正确地做到这一点,但这是一个小项目。

执行摘要:抱歉,这听起来不是个好主意。

编辑:这是从 dataex 中破解出来的。它应该适用于 <15 的各种版本。

*! 1.0.0 NJC 11apr2018 
program showvaluelabelsused 
    version 15 
    syntax [varlist] 

    quietly ds, has(vallabel) 

    foreach v in `r(varlist)'  {
        local l : value label `v'
        local vlabels : list vlabels | l
    }

    foreach vl in `vlabels' {
        local alllevels
        qui ds , has(vallabel `vl')
        local vlist `r(varlist)'
        foreach v in `vlist' {
            qui levelsof `v', local(levels) missing
            local alllevels : list alllevels | levels
            dis as res "label values `v' `vl'"
        }

        foreach n in `alllevels' {
            local ltext : label `vl' `n', strict
            if `"`ltext'"' != "" {
                if strpos(`"`ltext'"',char(34)) dis as res `"label def `vl' `n' `"`ltext'"', modify"'
                else dis as res `"label def `vl' `n' "`ltext'", modify"'
            }
        }
    }
end 

. sysuse auto, clear
(1978 Automobile Data)

. showvaluelabelsused
foreign
label values foreign origin
label def origin 0 "Domestic", modify
label def origin 1 "Foreign", modify

. keep if foreign
(52 observations deleted)

. showvaluelabelsused
label values foreign origin
label def origin 1 "Foreign", modify

. webuse nlswork, clear
(National Longitudinal Survey.  Young Women 14-26 years of age in 1968)

. showvaluelabelsused
label values race racelbl
label def racelbl 1 "white", modify
label def racelbl 2 "black", modify
label def racelbl 3 "other", modify

. keep if race == 2
(20,483 observations deleted)

. showvaluelabelsused
label values race racelbl
label def racelbl 2 "black", modify