【问题标题】:Drop redundant value labels删除多余的值标签
【发布时间】:2018-04-11 08:54:41
【问题描述】:

我有一部分大数据集。许多变量包含值标签,但这些值不存在于这部分数据集中。我想从数据集中删除多余的值标签。我尝试在 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
    }
}

【问题讨论】:

    标签: stata labels


    【解决方案1】:

    没有“显然”:这不是法律法规,甚至在原则上也没有意义。充其量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 中窃取的。它应该适用于

    *! 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
    

    【讨论】:

    • 亲爱的尼克,感谢您的回答和建议。我完全理解你的担忧,但我不想去推理为什么我需要摆脱多余的(未使用的)价值标签。我今天花了很多时间在这方面,但找不到比半手动处理变量更好的解决方案:fre var;目录 (lab_valid);标签放置变量;标签定义 var "标签 1" 2 "标签 2" 3 "标签 3",修改。
    • 您的选择,但我不会花时间编写程序来实现一个坏主意。
    • 好吧,如果是这样,我认为值得解释,这样你就知道它不是白费的。我需要分别以 Excel 格式和密码本向学生提供小型数据集。有时,当某些变量的值标签超过 500 个时,码本会非常长。这就是为什么对于用于教育目的的小型派生数据集,我需要通过删除冗余值标签来缩短码本。
    • 解释真正的问题使它更容易解决。将您的数据集简化为示例数据集,然后运行 ​​dataex 以生成 input 和其他代码以重现它以及 save 什么结果。
    • 尼克,感谢您为此投入时间。提供的程序正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2017-02-03
    • 1970-01-01
    • 2012-05-29
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多