在 Stata 中使用循环将字符串变量成对加入两个
Join string variables in pairs of two using loops in Stata
我有许多字符串变量 v1 v2 ... v10
每个都包含一个字母。我想做的是加入 v1
和 v2
,v3
和 v4
等等,直到 v9
和 v10
。对于单个案例,代码很简单 v12 = v1 + v2
。问题是当我想对数据集中的所有对执行此操作时。我尝试了以下代码,但得到了错误的结果。
forval i=1(2)9 {
gen var`i' = v`i' + v`i+1'
}
这是我想要的示例:
v1 v2 v12
G G GG
A G AG
G G GG
A A AG
以及我得到的:
v1 v2 v12
G G GG
A G AA
G G GG
A A AA
出于某种原因,它使用了同一个变量 (v1
) 两次。
您不能以这种方式对本地宏进行算术运算,即使是那些包含数字的宏。奇怪的是,Stata 只是忽略了宏引用中的额外 +1
,如本例所示:
. local i = 1
. di "`i+1'"
1
严格来说,i+1
不是合法的宏名称,给定 +
字符。无论如何,忽略 Stata 所做的额外文本。
有多种方法可以获得您想要的东西。这是一个:
forval i = 1(2)9 {
local j = `i' + 1
gen var`i' = v`i' + v`j'
}
还有一个:
forval i = 1(2)9 {
gen var`i' = v`i' + v`=`i'+1'
}
额外的符号
`= '
表示计算给定的表达式,然后插入结果。它在精神上与你正在尝试的很接近。
试试这个。
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
forval i=1/2{
gen var`i'=v`i'+v`=`i'+1'
}
list, clean
这是输出。
v1 v2 v3 var1 var2
1. G G Q GG GQ
2. A G R AG GR
3. G G S GG GS
4. A A T AA AT
您需要 forval i=1/9
。内联宏i加1的语法`=`i'+1'在help macro
.
中称为展开运算符
你得到的有点奇怪
. local i 4
. dis "`i+1'"
4
这可能是因为宏展开永远不会引发错误。
无论如何,有宏扩展运算符可用于递增或递减宏(参见 help macro
)。
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
local i = 1
while `i' < 3 {
gen var`i' = v`i' + v`++i'
}
list, clean
你甚至可以玩循环计数器:
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
forval i=1/2{
gen var`i' = v`i++' + v`i--'
}
list, clean
我有许多字符串变量 v1 v2 ... v10
每个都包含一个字母。我想做的是加入 v1
和 v2
,v3
和 v4
等等,直到 v9
和 v10
。对于单个案例,代码很简单 v12 = v1 + v2
。问题是当我想对数据集中的所有对执行此操作时。我尝试了以下代码,但得到了错误的结果。
forval i=1(2)9 {
gen var`i' = v`i' + v`i+1'
}
这是我想要的示例:
v1 v2 v12
G G GG
A G AG
G G GG
A A AG
以及我得到的:
v1 v2 v12
G G GG
A G AA
G G GG
A A AA
出于某种原因,它使用了同一个变量 (v1
) 两次。
您不能以这种方式对本地宏进行算术运算,即使是那些包含数字的宏。奇怪的是,Stata 只是忽略了宏引用中的额外 +1
,如本例所示:
. local i = 1
. di "`i+1'"
1
严格来说,i+1
不是合法的宏名称,给定 +
字符。无论如何,忽略 Stata 所做的额外文本。
有多种方法可以获得您想要的东西。这是一个:
forval i = 1(2)9 {
local j = `i' + 1
gen var`i' = v`i' + v`j'
}
还有一个:
forval i = 1(2)9 {
gen var`i' = v`i' + v`=`i'+1'
}
额外的符号
`= '
表示计算给定的表达式,然后插入结果。它在精神上与你正在尝试的很接近。
试试这个。
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
forval i=1/2{
gen var`i'=v`i'+v`=`i'+1'
}
list, clean
这是输出。
v1 v2 v3 var1 var2
1. G G Q GG GQ
2. A G R AG GR
3. G G S GG GS
4. A A T AA AT
您需要 forval i=1/9
。内联宏i加1的语法`=`i'+1'在help macro
.
你得到的有点奇怪
. local i 4
. dis "`i+1'"
4
这可能是因为宏展开永远不会引发错误。
无论如何,有宏扩展运算符可用于递增或递减宏(参见 help macro
)。
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
local i = 1
while `i' < 3 {
gen var`i' = v`i' + v`++i'
}
list, clean
你甚至可以玩循环计数器:
clear
input str1 (v1 v2 v3)
G G Q
A G R
G G S
A A T
end
forval i=1/2{
gen var`i' = v`i++' + v`i--'
}
list, clean