删除冗余值标签

时间:2018-04-11 08:54:42

标签: stata 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
    }
}

1 个答案:

答案 0 :(得分:2)

没有“显然”:它不是合法的代码,原则上也没有意义。最好label drop删除命名标签,但标签的名称和它们所附加的任何变量的名称不一致,除非您以这种方式设置它。

这是可疑的:

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

  2. 这种问题似乎意味着在您出现之前已经设置了价值标签,并且每个值都可能找到一个坚持的观察。这很可能是明智的想法。

  3. 这很危险:

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

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

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

    4. 所以,我不建议你在考虑什么。您可以使用值标签尝试每个变量的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