Stata嵌套foreach循环子串比较

问题描述:

我刚刚开始学习Stata,并且我很难。 我的问题是这样的:我有两个不同的变量,ATCA,其中A可能是ATC的子字符串。 现在我想标记AATC的子字符串与OK = 1的所有观察。Stata嵌套foreach循环子串比较

我想这用一个简单的嵌套循环:

foreach x in ATC { 
foreach j in A { 
     replace OK = 1 if strpos(`x',`j')!=0 
    } 
} 

但是,每当我跑这个循环没有变化正在作出即使应该有很多。 我觉得我应该给一个索引指定哪个OK正在改变(属于ATC/x的那个),但我不知道该怎么做。这可能很简单,但我一直在努力一段时间。


我应该澄清:我A名单是从主列表(简单地附加到)分离,只包含我用它来识别ATC S的我想唯一的密钥。所以我有〜120 A-键和几百万个键ATC。我想要做的是迭代每密钥为每个A键,并标记ATCA合格。

这意味着我没有完整的元组(ATC,A,OK),而是分开不同大小的列表。 例如:我有

ATC OK A 
ABCD 0 . 
EFGH 0 . 
... ... ... 
.  . AB 
.  . ET 

,并希望结果是"ABCD"OK被标记为1"EFGH"保持在0

我们可以将您的问题分为两部分。你的标题意味着循环的问题,但你的循环只是相当于

replace OK = 1 if strpos(ATC, A)!=0 

所以使用循环显得无关紧要。这留下了子串比较。

让我们提供一个例子:

. set obs 3 
obs was 0, now 3 

. gen OK = 0 

. gen A = cond(_n == 1, "42", "something else") 

. gen ATC = "answer is 42" 

. replace OK = 1 if strpos(ATC, A) != 0 
(1 real change made) 

. list 

    +------------------------------------+ 
    | OK    A   ATC | 
    |------------------------------------| 
1. | 1    42 answer is 42 | 
2. | 0 something else answer is 42 | 
3. | 0 something else answer is 42 | 
    +------------------------------------+ 

所以它工作正常;如果你认为你有不同的东西,你真的需要给出一个可重复的例子。

至于说明变量应该改变的地方:你的代码就是这样做的,正如上面的例子所示。


该更新使问题清楚。当你指定你给出的语法时,Stata只会在相同的观察中查找匹配的子字符串。 Stata中的变量是数据集中的字段。要在周期的一组值,这样的事情应该足够

gen byte OK = 0 
levelsof A, local(Avals) 

quietly foreach A of local Avals { 
    replace OK = 1 if strpos(ATC, `"`A'"') > 0 
} 

注:

  1. 指定byte精简存储。

  2. 您可能需要ifin限制levelsof

  3. quietly删除有关更改值的消息。在调试时,通常最好不要这样做。

  4. > 0可能会被省略,因为strpos()在逻辑比较中被自动视为true。见this FAQ

+0

我编辑了我原来的帖子。我应该从一开始就给出一个例子,谢谢你的帮助。我为我差的格式化等道歉,因为我不使用这个网站非常。 – user2299050 2014-12-07 00:47:28

+0

删除“可能”。问题现在很清楚。 – 2014-12-07 01:04:46

+0

感谢您的关闭! – 2014-12-07 01:47:02