2015-07-02 127 views
2

我有许多字符串变量v1 v2 ... v10,每个字母变量都包含一个字母。我想要做的是加入v1v2,v3v4等等直到v9v10。对于单个案例,代码很简单v12 = v1 + v2。问题是当我想为我的数据集中的所有对执行此操作时。我尝试下面的代码,但我得到错误的结果。在Stata中使用循环成对加入字符串变量

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)两次某些原因。

回答

4

你不能用本地宏,甚至那些包含数字的算法来进行算术运算。这是塔塔只是忽略了宏引用中额外+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' 
} 

额外的符号

`= ' 

方式计算表达式给出,然后插入结果。它与你所尝试的精神紧密相关。

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在你的情况。用于将内联值1加1的语法`=`i'+ 1'称为help macro中的扩展运算符。

1

这是一种奇怪的是,你得到

. 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 
相关问题