Строка с индикаторной переменной, ошибка несоответствия типов - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь преобразовать строковую переменную (тип str2, формат %9s) в переменную-индикатор в Stata.

Тем не менее, я получаю следующее сообщение об ошибке:

несоответствие типов r (109)

Я использую набор ANES 2016 года и по сутипопытка сгруппировать состояния в открытые первичные и закрытые первичные / закрытые состояния.

Я попытался следующий код:

gen oprim= (state=="AL" & "AK" & "CO" & "GA" &...)

gen oprim=1 if state=="AL" & "AK" & "CO" & "GA" &...

У меня были проблемы с преобразованием этой переменной раньше.Например, я попытался сгенерировать новую переменную индикатора, не заключая в кавычки коды состояния.

Я также попытался destring для переменной, но я получаю следующий вывод:

destring state, generate(statenum) float
state: contains nonnumeric characters; no **generate**

Любая помощь, которую кто-либо может предложить, будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Давайте разберемся почему код в вопросе неправильный.OP не дает пример данных, но все ошибки можно идентифицировать без таких данных, естественно, предполагая, что state является строковой переменной в наборе данных.

Во-первых, мы можем опустить ... (что никто не считает законным) и скобки (которые не имеют значения).

gen oprim = state=="AL" & "AK" & "CO" & "GA"

gen oprim=1 if state=="AL" & "AK" & "CO" & "GA" 

Любой из них завершится ошибкой, потому что Stata анализирует условие if как

if

state == "AL"

& "AK"

& "CO"

& "GA"

state == "AL" - это условие истинного или ложного, оцениваемое как 0 или 1, но не равное "AK" "CO""GA" является истинным или ложным условием;все они являются строковыми значениями, поэтому команды не выполняются, потому что Stata должен видеть что-то числовое в качестве каждого элемента в состоянии if.Хотя это явно глупо,

gen oprim = state == "AL" & 42

будет допустимым, так как 42 является числовым (и в оценках «истинно или неверно» считается истинным).Stata не будет заполнять state ==, что, как вы надеетесь, подразумевается.

Если переписать

gen oprim = state == "AL" & state == "AK" & state == "CO" & state == "GA" 

, то у вас есть легальная команда.Это просто совсем не то, что вы, очевидно, хотите.Для state невозможно быть равным различным строковым значениям в одном и том же наблюдении, что и проверяет эта команда.Вы путаете & (и) с | (или).

gen oprim = state == "AL" | state == "AK" | state == "CO" | state == "GA" 

Такие операторы становятся длинными и утомительными и подвержены ошибкам, но Stata имеет альтернативный синтаксис

gen oprim = inlist(state, "AL", "AK", "CO", "GA") 

Есть ограничения для этого - и все же другие стратегии тоже- но я оставлю этот ответ там, не затрагивая дальнейшие вопросы.

0 голосов
/ 23 ноября 2018

Используя первые десять наблюдений набора игрушечных данных census:

sysuse census, clear
keep if _n <= 10

Для меня работает следующее:

generate oprim = 0 
replace oprim = 1 if state2 == "AZ" | state2 == "DE"

list state2 oprim, separator(0)

     +----------------+
     | state2   oprim |
     |----------------|
  1. | AL           0 |
  2. | AK           0 |
  3. | AZ           1 |
  4. | AR           0 |
  5. | CA           0 |
  6. | CO           0 |
  7. | CT           0 |
  8. | DE           1 |
  9. | FL           0 |
 10. | GA           0 |
     +----------------+
...