Suppose you need to type the following command that has many conditions in the if condition:
replace group = 1 if (benefitNumber == 1 | benefitNumber == 2 | benefitNumber == 3 | benefitNumber == 4 | benefitNumber == 5 | benefitNumber == 6 | benefitNumber == 11 | benefitNumber == 12 | benefitNumber == 17 | benefitNumber == 19 | benefitNumber == 21 | benefitNumber == 22 | benefitNumber == 23)
It's a bit much to type. The program megaif below will generate this long line from the much shorter command:
megaif 1 2 3 4 5 6 11 12 17 19 21 22 23, v(benefitNumber) c(replace group = 1)
The above has lots of "or equals", but you can also generate lots of "and does not equal", for example:
replace group = 1 if (benefitNumber != 1 & benefitNumber != 2 & benefitNumber != 3 & benefitNumber != 4 & benefitNumber != 5 & benefitNumber != 6 & benefitNumber != 11 & benefitNumber != 12 & benefitNumber != 17 & benefitNumber != 19 & benefitNumber != 21 & benefitNumber != 22 & benefitNumber != 23)
using the following command:
megaif 1 2 3 4 5 6 11 12 17 19 21 22 23, v(benefitNumber) c(replace group = 1) e(!=) s(&)
It works for numeric variables and for string variables too. Check this out:
megaif "a b" b "cc" d `"e"', v(benefit_stringvar) c(replace group = 1) e(!=) s(&)
executes the following command:
cmd to execute: replace group = 1 if (benefit_stringvar != "a b" & benefit_stringvar != "b" & benefit_stringvar != "cc" & benefit_stringvar != "d" & benefit_stringvar != "e")
As you can see, for string variables the quotes are optional unless you're checking for text that has a space in it. The program is below. Enjoy!
program define megaif
// By Shafique Jamal
// e.g.
// sysuse auto, clear
// megaif 0 1, v(foreign) c(drop) e(~=) // this will drop all the observations. Just for illustrative purposes to show how the command could be used
// another e.g.
// The command:
// megaif 14 15 16 17 18 19 20 21 22, c(gen priv1 = 1) var(income_type2)
// would execute the following command:
// gen priv1 = 1 if (income_type2 == "14" | income_type2 == "15" | income_type2 == "16" | income_type2 == "17" | income_type2 == "18" | income_type2 == "19" | income_type2 == "20" | income_type2 == "21" | income_type2 == "22")
syntax anything(id="variable and values" name=arguments), Var(varname) Cmd(string) [Equality(string) Separator(string)]
// The default is equality
if ("`equality'" == "") {
local equality "=="
}
if ("`separator'" == "") {
local separator " | "
}
else {
local separator " `separator' "
}
cap confirm numeric variable `var'
if (_rc == 0) { // variable is numeric
local numericvar = 1
}
else {
local numericvar = 0
}
// di "numericvar = `numericvar'"
local count = 0
local orcondition ""
foreach w of local arguments {
local count = `count' + 1
// di `"w = `w'"'
if (`numericvar' == 0) {
local orcondition `"`orcondition'`orseparator'`var' `equality' "`w'""'
}
else {
local orcondition `"`orcondition'`orseparator'`var' `equality' `w'"'
}
local orseparator "`separator'"
}
// di `"orcondition = `orcondition'"'
di `"cmd to execute: `cmd' if (`orcondition') "'
// set trace on
// set traced 1
`cmd' if (`orcondition')
set trace off
end
replace group = 1 if (benefitNumber == 1 | benefitNumber == 2 | benefitNumber == 3 | benefitNumber == 4 | benefitNumber == 5 | benefitNumber == 6 | benefitNumber == 11 | benefitNumber == 12 | benefitNumber == 17 | benefitNumber == 19 | benefitNumber == 21 | benefitNumber == 22 | benefitNumber == 23)
It's a bit much to type. The program megaif below will generate this long line from the much shorter command:
megaif 1 2 3 4 5 6 11 12 17 19 21 22 23, v(benefitNumber) c(replace group = 1)
The above has lots of "or equals", but you can also generate lots of "and does not equal", for example:
replace group = 1 if (benefitNumber != 1 & benefitNumber != 2 & benefitNumber != 3 & benefitNumber != 4 & benefitNumber != 5 & benefitNumber != 6 & benefitNumber != 11 & benefitNumber != 12 & benefitNumber != 17 & benefitNumber != 19 & benefitNumber != 21 & benefitNumber != 22 & benefitNumber != 23)
using the following command:
megaif 1 2 3 4 5 6 11 12 17 19 21 22 23, v(benefitNumber) c(replace group = 1) e(!=) s(&)
It works for numeric variables and for string variables too. Check this out:
megaif "a b" b "cc" d `"e"', v(benefit_stringvar) c(replace group = 1) e(!=) s(&)
executes the following command:
cmd to execute: replace group = 1 if (benefit_stringvar != "a b" & benefit_stringvar != "b" & benefit_stringvar != "cc" & benefit_stringvar != "d" & benefit_stringvar != "e")
As you can see, for string variables the quotes are optional unless you're checking for text that has a space in it. The program is below. Enjoy!
program define megaif
// By Shafique Jamal
// e.g.
// sysuse auto, clear
// megaif 0 1, v(foreign) c(drop) e(~=) // this will drop all the observations. Just for illustrative purposes to show how the command could be used
// another e.g.
// The command:
// megaif 14 15 16 17 18 19 20 21 22, c(gen priv1 = 1) var(income_type2)
// would execute the following command:
// gen priv1 = 1 if (income_type2 == "14" | income_type2 == "15" | income_type2 == "16" | income_type2 == "17" | income_type2 == "18" | income_type2 == "19" | income_type2 == "20" | income_type2 == "21" | income_type2 == "22")
syntax anything(id="variable and values" name=arguments), Var(varname) Cmd(string) [Equality(string) Separator(string)]
// The default is equality
if ("`equality'" == "") {
local equality "=="
}
if ("`separator'" == "") {
local separator " | "
}
else {
local separator " `separator' "
}
cap confirm numeric variable `var'
if (_rc == 0) { // variable is numeric
local numericvar = 1
}
else {
local numericvar = 0
}
// di "numericvar = `numericvar'"
local count = 0
local orcondition ""
foreach w of local arguments {
local count = `count' + 1
// di `"w = `w'"'
if (`numericvar' == 0) {
local orcondition `"`orcondition'`orseparator'`var' `equality' "`w'""'
}
else {
local orcondition `"`orcondition'`orseparator'`var' `equality' `w'"'
}
local orseparator "`separator'"
}
// di `"orcondition = `orcondition'"'
di `"cmd to execute: `cmd' if (`orcondition') "'
// set trace on
// set traced 1
`cmd' if (`orcondition')
set trace off
end
2 comments:
I think the command inlist does the same thing ?
replace group = 1 if inlist(benefitNumber, 1, 2, 3, 4, 5, 6, 11, 12, 17, 19, 21, 22, 23)
?
Cool. Wish I had know that earlier - thanks for posting!
Post a Comment