我正在使用很长的商品名称列表(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在这种情况下不会知道我是否希望它使用或运算符(是的,我愿意)或运算符。
答案 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'")
}