Stata嵌套foreach循环子串比较
问题描述:
我刚刚开始学习Stata,并且我很难。 我的问题是这样的:我有两个不同的变量,ATC
和A
,其中A
可能是ATC
的子字符串。 现在我想标记A
是ATC
的子字符串与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
键,并标记ATC
键A
合格。
这意味着我没有完整的元组(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
}
注:
指定
byte
精简存储。您可能需要
if
或in
限制levelsof
。quietly
删除有关更改值的消息。在调试时,通常最好不要这样做。> 0
可能会被省略,因为strpos()
在逻辑比较中被自动视为true。见this FAQ。
我编辑了我原来的帖子。我应该从一开始就给出一个例子,谢谢你的帮助。我为我差的格式化等道歉,因为我不使用这个网站非常。 – user2299050 2014-12-07 00:47:28
删除“可能”。问题现在很清楚。 – 2014-12-07 01:04:46
感谢您的关闭! – 2014-12-07 01:47:02