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?

questionAnswers(1)

yourAnswerToTheQuestion