2017-04-20 74 views
1

我正在處理一個很長的商品名稱列表(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操作符(是的,我會)或者和操作符。

回答

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

尼克考克斯:謝謝你的幫助。這工作完美,並會節省很多時間。我似乎無法標記,但是如果我想避免部分字符串,是否有任何指示?正如你所說,假設大豆不符合我不想包括的任何東西,那麼它會降低到「gen soy = strpos(var1,」oybean「)> 0。如果字符串」花式大豆「對我不感興趣但是一串說「花式大豆和大豆」有興趣(因爲「正常」大豆)? – Nox

+1

一種方法是查看如果從串中刪除「花式大豆」,剩下的東西是什麼?您不必改變變量,只是在'subinstr(var1,「花式大豆」,「」,。)'上工作。 –