循环使用本地列表搜索字符串变量

时间:2017-04-20 21:33:33

标签: string loops stata

我正在使用很长的商品名称列表(var1)。我想通过创建第二个变量(var2)来提取此列表中的信息,如果var1包含某些关键字,则该变量等于1。

我使用以下代码:

g soy = strpos(productsproduced, "Soybeans, ") | strpos(productsproduced, "Soybean, ")   | strpos(productsproduced, "soybeans, ")| strpos(productsproduced, "soybean, ") | productsproduced == "Soybeans" 

如果数据没有正确编码,则列表会更长,并且每个名称都以多种不同的方式出现(如代码示例中的摘录所示)。

我相信使用列表会更容易(当然更容易查看列表,看看我是否遗漏了任何内容等)。

不幸的是,自从我使用循环以来已经有一段时间了,但我正在考虑这样的事情:

local mylist Soybean soybean Soybeans soybeans Soybeans, soybeans,
forval i = mylist {
g soy = strpos(var1, "`i'")
}

这并不是很有效,但我不知道如何编码。一个明确的问题是Stata在这种情况下不会知道我是否希望它使用或运算符(是的,我愿意)或运算符。

1 个答案:

答案 0 :(得分:3)

精神很明显;细节需要各种修复。

local mywords Soybean soybean Soybeans soybeans Soybeans, soybeans,
gen soy = 0 
foreach w of local mywords {
   replace soy = soy | strpos(var1, "`w'")
}

关键是你需要在循环中replace;否则循环将在generate上第二次失败,因为变量已经存在。

实际上这个例子简化为

gen soy = strpos(var1, "oybean") > 0 

假设oybean不匹配任何不想要的东西。

标准化为小写通常很有帮助

local mywords soybean soybeans soybeans, 
gen soy = 0 
foreach w of local mywords {
   replace soy = soy | strpos(lower(var1), "`w'")
}