我想在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" ...
答案 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)
但是,您可能已经简化了一些对您来说很重要的事情,以便专注于代码方面的问题。