假设我有factor variable标签" a" " B"和" c"并希望看到哪些观察结果的标签为" b"。 Stata拒绝解析
gen isb = myfactor == "b"
当然,字面上存在"类型不匹配",因为我的因子被编码为整数,因此无法与字符串" b"进行比较。但是,它不会杀死Stata(i)执行明显的解析或(ii)提供翻译功能,因此我可以将比较写为label(myfactor) == "b"
。使用decode
来(重新)创建一个字符串变量会破坏编码的目的,即节省空间并提高计算效率,对吗?
我没有真正期望上面的比较有效,但我至少认为会有一线或两线的方法。这是我到目前为止所发现的。有一个很好的宏("扩展")函数映射另一种方式(从整数到标签,见下面的local labi: label ...
)。以下是使用它的解决方案:
// sample data
clear
input str5 mystr int mynum
a 5
b 5
b 6
c 4
end
encode mystr, gen(myfactor)
// first, how many groups are there?
by myfactor, sort: gen ng = _n == 1
replace ng = sum(ng)
scalar ng = ng[_N]
drop ng
// now, which code corresponds to "b"?
forvalues i = 1/`=ng'{
local labi: label myfactor `i'
if "b" == "`labi'" {
scalar bcode = `i'
break
}
}
di bcode
第二步让我感到烦恼,但我确信还有更快,更惯用的方式来执行第一步。我可以抓住标签向量的长度吗?例如?
答案 0 :(得分:4)
一个例子:
clear all
set more off
sysuse auto
gen isdom = 1 if foreign == "Domestic":`:value label foreign'
list foreign isdom in 1/60
这会创建一个名为isdom
的变量,如果foreigns
的值标签等于"国内"它将等于1。它使用扩展宏功能。
来自 [U] 18.3.8 宏表达式:
另外,输入
command that makes reference to `:extended macro function'
相当于
local macroname : extended macro function command that makes reference to `macroname'
这解释了提供的语法中的两个:
之一。另一个可以解释
...直接在表达式中指定值标签,而不是通过 基础数值...您可以用双引号指定标签 (""),后跟冒号(:),后跟值的名称 标签
引用来自 Stata tip 14:在表达式中使用值标签,作者:Kenneth Higbee,The Stata Journal(2004)。可在http://www.stata-journal.com/sjpdf.html?articlenum=dm0009
免费获取在计算不同观察的数量时,另一种方法是:
by myfactor, sort: gen ng = _n == 1
count if ng
scalar sc_ng = r(N)
display sc_ng
但是你的很好。事实上,这里记录了它:http://www.stata.com/support/faqs/data-management/number-of-distinct-observations/,以及更多的方法和评论。