【问题标题】:How to loop through specific string values of a variable in Stata?如何循环遍历Stata中变量的特定字符串值?
【发布时间】:2015-06-15 10:51:20
【问题描述】:

我想遍历 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
}

但是这只循环通过“日本”...

【问题讨论】:

  • 描述其最终目的可能会为您提供更好的建议。
  • 这个问题还没有产生一个可理解的、清晰的和可重现的问题。我在更新的答案中评论了您修改后的代码。随着代码减少到微不足道的程度,我认为您编辑了真正的问题。
  • 你完全正确。对此感到抱歉。我将删除我的问题,因为它对其他用户没有价值。

标签: string loops stata


【解决方案1】:

我不得不猜测答案在于您用点表示的数据或代码。例如,检查尾随空格,例如 "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) 

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

【讨论】:

  • 谢谢!你是完全正确的。问题是点中的内容。我编辑了我的问题。问题是我收到一个可确认性错误 r(503)。我认为第一个循环后矩阵'm'有问题......你能帮我解决这个问题吗?
  • 至少,您的foreach per of local period 应该是 periodlev,而不是 period。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2019-12-01
  • 2015-02-27
  • 2016-01-24
相关资源
最近更新 更多