comparação de cadeias contra fatores no Stata
Suponha que eu tenho umvariável fator com os rótulos "a" "b" e "c" e deseja ver quais observações têm o rótulo "b". Stata se recusa a analisar
gen isb = myfactor == "b"
Claro, existe literalmente uma "incompatibilidade de tipo", pois meu fator é codificado como um número inteiro e, portanto, não pode ser comparado à string "b". No entanto, não mataria o Stata para (i) executar a análise óbvia ou (ii) fornecer uma função de tradutor para que eu possa escrever a comparação comolabel(myfactor) == "b"
. Usandodecode
(re) criar uma variável de string derrota o propósito da codificação, que é economizar espaço e tornar os cálculos mais eficientes, certo?
Eu realmente não esperava que a comparação acima funcionasse, mas pelo menos imaginei que haveria uma abordagem de uma ou duas linhas. Aqui está o que eu encontrei até agora. Há uma boa função de macro ("estendida") que mapeia para o outro lado (de um número inteiro para um rótulo, visto abaixo comolocal labi: label ...
) Aqui está a solução para usá-lo:
// 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
O segundo passo é o que me irrita, mas tenho certeza de que há também uma maneira mais rápida e mais idiomática de executar o primeiro passo. Posso pegar o comprimento do vetor do rótulo, por exemplo?