如何在Stata中循环变量的特定字符串值?

时间:2015-06-15 10:51:20

标签: string loops stata

我想在Stata中循环遍历字符串变量的特定子集向量。我的数据集如下:

id  country  effect  period
1   US       0.20    2
2   US       0.25    3
3   Japan    0.37    2
4   Germany  0.22    3
5   US       0.11    3
6   Japan    0.43    1
7   Ireland  0.30    1
...

我不想遍历国家/地区变量的所有值,但只能通过特定值,例如美国和日本。我试过了:

levelsof country if country=="US" | country=="Japan", local(countrylev)
levelsof period, local(periodlev) //periods are 1,2,3,4
mat m = J(2,4,.)
local i=1
local j=1

foreach x of local countrylev {
 foreach per of local periodlev {
    mat m[`i',`j']=`per' *2
    local ++j
    mat m[`i',`j']=`per' *3
    local ++j 
    mat m[`i',`j']=`per' *3
    local ++j 
    mat m[`i',`j']=`per' *4
    local ++i
    local j=1
 }
 matrix list m
}

然而,这只能通过" Japan" ...

1 个答案:

答案 0 :(得分:2)

我必须猜测答案在于您用点表示的数据或代码。例如,检查尾随空格,例如"US "

对于骑自行车的两个不同的值,您可以直接说出

foreach c in US Japan { 
   <stuff> if country == "`c'" 
}

除了(如上所述)尾随空格可能会破坏这一点。如果空格有问题,请使用trim()

通常更容易映射到数字变量,然后使用所需的不同数值。当你还有空白和/或其他标点符号时,尤其如此。有关更多信息,请参阅(例如)this FAQ(这比标题所暗示的更相关;请参阅方法1)。

更新

修改后的代码使问题更令人费解,而不是更少。你的代码似乎很简单 到

mat m = J(2,4,.)

forval i = 1/2 {
    forval j = 1/4 {
        mat m[`i',`j']=`j'*2
        mat m[`i',`j']=`j'*3
        mat m[`i',`j']=`j'*3
        mat m[`i',`j']=`j'*4
    }
}

matrix li M 

每次循环时列出矩阵并不重要。

事实上,这个例子似乎已经崩溃到一行

mat M = (2,3,3,4)' * (1,2,3,4) 

但是,您可能已经简化了一些对您来说很重要的事情,以便专注于代码方面的问题。