字符串比较Stata中的因素

时间:2014-09-19 20:57:52

标签: comparison stata

假设我有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

第二步让我感到烦恼,但我确信还有更快,更惯用的方式来执行第一步。我可以抓住标签向量的长度吗?例如?

1 个答案:

答案 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/,以及更多的方法和评论。