Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 循环使用本地列表搜索字符串变量_String_Loops_Stata - Fatal编程技术网

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

String 循环使用本地列表搜索字符串变量,string,loops,stata,String,Loops,Stata,我正在处理一个很长的商品名称列表(var1)。我想通过创建第二个变量(var2)从该列表中提取信息,如果var1包含某些关键字,则该变量等于1 我使用了以下代码: g soy = strpos(productsproduced, "Soybeans, ") | strpos(productsproduced, "Soybean, ") | strpos(productsproduced, "soybeans, ")| strpos(productsproduced, "soybean, ")

我正在处理一个很长的商品名称列表(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不知道我是希望它使用or操作符(是的,我会)还是and操作符

精神是显而易见的;细节需要各种修复

local mywords Soybean soybean Soybeans soybeans Soybeans, soybeans,
gen soy = 0 
foreach w of local mywords {
   replace soy = soy | strpos(var1, "`w'")
}
重要的是,您需要在循环中
替换
;否则,循环将在
生成的
上第二轮失败,因为变量已经存在

事实上,这个例子简化为

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'")
}

尼克·考克斯:谢谢你的帮助。这样做非常有效,可以节省大量时间。我似乎无法标记,但您是否有任何指针,以防我想要避免字符串的部分?正如您所说,假设oybean与我不想包含的任何内容都不匹配,那么它将减少到“gen soy=strpos(var1,“oybean”)>0。如果字符串“fancy soybeans”对我不感兴趣,但字符串“fancy soybeans and soybeans”对我感兴趣(因为“正常”大豆),该怎么办?一种方法是查看从字符串中删除
花式大豆后剩下的内容。不必更改变量,只需使用
子instr(var1,“花式大豆”,”,)