字符串转指示变量,类型不匹配错误
String to indicator variable, type mismatch error
我正在尝试将字符串变量(类型 str2
,格式 %9s
)转换为 Stata 中的指示变量。
但是,我不断收到以下错误:
type mismatch r(109)
我正在使用 2016 年 ANES 集,我实际上是在尝试将状态分组为开放的主要状态和封闭的 primary/caucus 状态。
我尝试了以下代码:
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**
如能提供任何帮助,我们将不胜感激。
使用 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 |
+----------------+
我们来说说为什么题中的代码是错误的。 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"
的 none 是真或假虚假条件;它们都是字符串值,因此命令失败,因为 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")
这有局限性——还有其他策略——但我将把这个答案留在那里,而不解决进一步的问题。
我正在尝试将字符串变量(类型 str2
,格式 %9s
)转换为 Stata 中的指示变量。
但是,我不断收到以下错误:
type mismatch r(109)
我正在使用 2016 年 ANES 集,我实际上是在尝试将状态分组为开放的主要状态和封闭的 primary/caucus 状态。
我尝试了以下代码:
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**
如能提供任何帮助,我们将不胜感激。
使用 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 |
+----------------+
我们来说说为什么题中的代码是错误的。 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"
的 none 是真或假虚假条件;它们都是字符串值,因此命令失败,因为 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")
这有局限性——还有其他策略——但我将把这个答案留在那里,而不解决进一步的问题。