我有大数据集的一部分。许多变量包含值标签,但此部分数据集中不存在此类值。我想从数据集中删除冗余值标签。我尝试使用各种方法在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
}
}
答案 0 :(得分:2)
没有“显然”:它不是合法的代码,原则上也没有意义。最好label drop
删除命名标签,但标签的名称和它们所附加的任何变量的名称不一致,除非您以这种方式设置它。
这是可疑的:
在大多数情况下,Stata不会使用大量内存存储值标签。价值标签的大部分意义是价值标签只需存储一次。
这种问题似乎意味着在您出现之前已经设置了价值标签,并且每个值都可能找到一个坚持的观察。这很可能是明智的想法。
这很危险:
相同的值标签可用于多个变量,因此原则上您需要检查使用特定集的所有变量的使用情况。
如果您append
或merge
使用类似的数据集,您需要担心会发生什么。这可能会导致比你想要的更多的混乱。
不那么刺耳,但也值得一提的是,数据中没有的值标签可能仍然可用于图形用途。
所以,我不建议你在考虑什么。您可以使用值标签尝试每个变量的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