在 Stata 中用循环重新编码多个变量
Recoding multiple variables with loop in Stata
我有 13 个虚拟变量,它们共享一个通用名称(由于 space 原因,没有包括所有 13 个)
describe Q23*
Variable Storage Display Value
name type format label Variable label
Q23Agricultur~k str5 %9s Q23: Agriculture
Q23Miningandq~g str5 %9s Q23: Mining
Q23Trade str5 %9s Q23: Trade
Q23Teaching str5 %9s Q23: Teaching
Q23Healthrela~k str5 %9s Q23: Health related work
Q23Transport str5 %9s Q23: Transport
Q23Repairing str5 %9s Q23: Repairing
Q23Construction str5 %9s Q23: Construction
Q23Manufactur~g str5 %9s Q23: Manufacturing
Q23Domesticwo~e str5 %9s Q23: Domestic work
它们都是具有 TRUE/FALSE 值的虚拟变量,因此我想将它们编码为分类变量。因为他们有相似的名字,我想这样就可以了
foreach x of varlist Q23* {
forvalues i = 1/13{
encode `x', gen(sector`i')
}
}
然而它所做的是生成13个sector
变量,名称从1到13,但全部对应农业,其余none变量。
describe sector*
Variable Storage Display Value
name type format label Variable label
--------------------------------------------------------------------------------------------------
sector1 long %8.0g sector1 Q23: Agriculture and livestock
sector2 long %8.0g sector2 Q23: Agriculture and livestock
sector3 long %8.0g sector3 Q23: Agriculture and livestock
sector4 long %8.0g sector4 Q23: Agriculture and livestock
sector5 long %8.0g sector5 Q23: Agriculture and livestock
sector6 long %8.0g sector6 Q23: Agriculture and livestock
sector7 long %8.0g sector7 Q23: Agriculture and livestock
sector8 long %8.0g sector8 Q23: Agriculture and livestock
sector9 long %8.0g sector9 Q23: Agriculture and livestock
sector10 long %8.0g sector10 Q23: Agriculture and livestock
sector11 long %8.0g sector11 Q23: Agriculture and livestock
sector12 long %8.0g sector12 Q23: Agriculture and livestock
sector13 long %8.0g sector13 Q23: Agriculture and livestock
我做错了什么?为什么循环不起作用?
谢谢!
如果没有一小段数据作为可重现的示例(正如 ThelceBear 在他们的评论中提到的),很难验证您在这里做错了什么,但有两点:
语言 'encoding dummy variables into categorical variables' 在这种情况下(或我能想到的任何情况下)并没有真正意义。虚拟变量只是分类变量的一个特例,其中类别数 = 2。如果您从变量中的 2 个类别开始,我看不出在没有一些额外数据的情况下如何将其转换为 2 个以上的类别。尽管如此,这更像是一个语义点——我想你的意思是你想把你的字符串变量编码成数字变量(基于你对 encode
的使用)。
您不需要内部循环。目前,您的代码在外循环的第一次迭代中将 sector*
变量设为 1-13,然后在下一次迭代中替换这些变量,依此类推,直到外循环完成。以下代码可以帮助您解决此问题:
local i = 1
foreach x of varlist Q23* {
encode `x', gen(sector`i')
local i = `i' + 1
}
这不是一个完整的答案,但已经发布了一个很好的答案,这个额外的 material 太尴尬了,不适合发表评论。
对于值为 "TRUE"
和 "FALSE"
的字符串变量,有一个直接的解决方案:
local i = 0
foreach v of var Q24* {
local ++i
gen sector`i' = `v' == "TRUE"
label var sector`i' "`: var label `v''"
}
如果 "FALSE"
以外的某些值是可能的,您也需要捕获它,除非您很高兴它会映射到 0。
我有 13 个虚拟变量,它们共享一个通用名称(由于 space 原因,没有包括所有 13 个)
describe Q23*
Variable Storage Display Value
name type format label Variable label
Q23Agricultur~k str5 %9s Q23: Agriculture
Q23Miningandq~g str5 %9s Q23: Mining
Q23Trade str5 %9s Q23: Trade
Q23Teaching str5 %9s Q23: Teaching
Q23Healthrela~k str5 %9s Q23: Health related work
Q23Transport str5 %9s Q23: Transport
Q23Repairing str5 %9s Q23: Repairing
Q23Construction str5 %9s Q23: Construction
Q23Manufactur~g str5 %9s Q23: Manufacturing
Q23Domesticwo~e str5 %9s Q23: Domestic work
它们都是具有 TRUE/FALSE 值的虚拟变量,因此我想将它们编码为分类变量。因为他们有相似的名字,我想这样就可以了
foreach x of varlist Q23* {
forvalues i = 1/13{
encode `x', gen(sector`i')
}
}
然而它所做的是生成13个sector
变量,名称从1到13,但全部对应农业,其余none变量。
describe sector*
Variable Storage Display Value
name type format label Variable label
--------------------------------------------------------------------------------------------------
sector1 long %8.0g sector1 Q23: Agriculture and livestock
sector2 long %8.0g sector2 Q23: Agriculture and livestock
sector3 long %8.0g sector3 Q23: Agriculture and livestock
sector4 long %8.0g sector4 Q23: Agriculture and livestock
sector5 long %8.0g sector5 Q23: Agriculture and livestock
sector6 long %8.0g sector6 Q23: Agriculture and livestock
sector7 long %8.0g sector7 Q23: Agriculture and livestock
sector8 long %8.0g sector8 Q23: Agriculture and livestock
sector9 long %8.0g sector9 Q23: Agriculture and livestock
sector10 long %8.0g sector10 Q23: Agriculture and livestock
sector11 long %8.0g sector11 Q23: Agriculture and livestock
sector12 long %8.0g sector12 Q23: Agriculture and livestock
sector13 long %8.0g sector13 Q23: Agriculture and livestock
我做错了什么?为什么循环不起作用?
谢谢!
如果没有一小段数据作为可重现的示例(正如 ThelceBear 在他们的评论中提到的),很难验证您在这里做错了什么,但有两点:
语言 'encoding dummy variables into categorical variables' 在这种情况下(或我能想到的任何情况下)并没有真正意义。虚拟变量只是分类变量的一个特例,其中类别数 = 2。如果您从变量中的 2 个类别开始,我看不出在没有一些额外数据的情况下如何将其转换为 2 个以上的类别。尽管如此,这更像是一个语义点——我想你的意思是你想把你的字符串变量编码成数字变量(基于你对
encode
的使用)。您不需要内部循环。目前,您的代码在外循环的第一次迭代中将
sector*
变量设为 1-13,然后在下一次迭代中替换这些变量,依此类推,直到外循环完成。以下代码可以帮助您解决此问题:
local i = 1
foreach x of varlist Q23* {
encode `x', gen(sector`i')
local i = `i' + 1
}
这不是一个完整的答案,但已经发布了一个很好的答案,这个额外的 material 太尴尬了,不适合发表评论。
对于值为 "TRUE"
和 "FALSE"
的字符串变量,有一个直接的解决方案:
local i = 0
foreach v of var Q24* {
local ++i
gen sector`i' = `v' == "TRUE"
label var sector`i' "`: var label `v''"
}
如果 "FALSE"
以外的某些值是可能的,您也需要捕获它,除非您很高兴它会映射到 0。