删除多余的值标签
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
删除命名标签,但标签的名称和它们所附加的任何变量的名称都不重合,除非您以这种方式进行设置。
这是可疑的:
在大多数情况下,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
我有一部分大数据集。许多变量包含值标签,但这些值不存在于这部分数据集中。我想从数据集中删除冗余值标签。我尝试使用各种方法在 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
删除命名标签,但标签的名称和它们所附加的任何变量的名称都不重合,除非您以这种方式进行设置。
这是可疑的:
在大多数情况下,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