Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down at the end of May, and its replacement, is already up and running.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: Combining value labels, appending

From   daniel klein <>
Subject   Re: st: Combining value labels, appending
Date   Thu, 12 May 2011 12:36:59 +0200

Nick was obviously qicker, but here's my try (-labvalpool-) anyway.

Syntax is

labvalpool newlblname lbname1 lblname2 [lblname3 ... lblnamek] [

newlabelname specifies the value label name for pooled labels
lblname1 ... lblnamek are names of (sets of) value labels to be pooled
(at least two must be specified)

REPLACE allows newlblname to be replaced in case it is already defined
UPDATE overwrites definitions in the order of lblnames specified.
Later definitions overwrite erlier ones.
Pool pools value labels

Note that Stata 11.2 is required, because -label copy- is used.


*! version 1.0.0 12may2011 Daniel Klein

prog labvalpool
	vers 11.2
	syntax namelist(id = "newlblname lblnames" min = 2) ///
	/*check options
	if "`update'" != "" & "`pool'" != "" {
		di "{err}update and pool not both allowed"
		exit 198
	else loc skip = ("`update'" == "") & ("`pool'" == "")
	/*get label names
	loc newlbl : word 1 of `namelist'
	if "`replace'" == "" {
		cap as `: word count `namelist'' > 2
		if _rc {
			di "{err}too few value labelnames specified"
			exit 198
		cap la li `newlbl'
		if !_rc {
			di "{err}label `newlbl' already defined"
			exit 110
	loc namelist : list namelist - newlbl
	loc nlbl : word count `namelist'
	/*check value labels exist and get names and values
	tempname vls
	forval j = 1/`nlbl' {
		loc lblnam`j' : word `j' of `namelist'
		qui la li `lblnam`j''
		mata : st_vlload("`lblnam`j''", vls = ., txt = .)
		mata : st_matrix("`vls'" ,vls)
		forval k = 1/`= rowsof(`vls')' {
			loc val = `vls'[`k', 1]
			loc lblval`j' `lblval`j'' `val'
	/*pool label sets
	loc lblvalpool `lblval1'
	la copy `lblnam1' `newlbl' ,`replace'
	forval j = 2/`nlbl' {
		foreach v of loc lblval`j' {
			if `: list posof "`v'" in lblvalpool' {
				if `skip' continue
				else if "`pool'" != "" {
					la de `newlbl' `v' ///
					`"`: lab `newlbl' `v'' `: lab `lblnam`j'' `v''"' ,modify
			la de `newlbl' `v' `"`: lab `lblnam`j'' `v''"' ,modify
			loc lblvalpool `lblvalpool' `v'



label define label1 1 "one" ,modify
label define label1 2 "two" ,modify
label define label1 3 "three" ,modify
label define label1 4 "four" ,modify

label define label2 4 "double" ,modify
label define label2 5 "five" ,modify
label define label2 6 "six" ,modify
label define label2 7 "seven" ,modify
label define label2 8 "eight" ,modify

label define label3 3 "new three" ,modify
label define label3 4 "antoher four" ,modify
label define label3 8 "new eight" ,modify
label define label3 9 "nine" ,modify

la li

labvalpool newlabel label1 label2 label3
la li

labvalpool newlabel label1 label2 label3 ,replace update
la li

labvalpool newlabel label1 label2 label3 ,replace pool
la li


*   For searches and help try:

© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index