2014-03-04 49 views
1

有什麼方法可以根據給定字符串變量中存在的關鍵字對二進制變量進行編碼嗎?簡單的例子:Stata:以字符串變量中的關鍵字爲條件的代碼二進制變量

我有一個字符串變量,它描述了各種餐食和一個虛擬變量,表示給定的餐是不是早餐。有什麼辦法編寫

早餐= 1,如果一頓== [那麼什麼說法含有雞蛋,燻肉等]

這是一個愚蠢的例子,但我更感興趣的是確定一個快捷方式到編碼二進制變量,基於字符串數據中的信息。

回答

0

您可以使用egenmore軟件包的incss功能。

ssc install egenmore 
egen bacon = incss(meal), sub(bacon) insensitive 

如果對於給定的觀察結果,字符串變量「meal」包含bacon這個詞,這會給你一個等於1的假人。否則爲零。該選項不敏感告訴Stata不考慮區分大小寫(否則培根與培根不同)。據我所知,你只能搜索一個子串在一個時間,但你可以很容易地編寫一個循環是:

foreach word in bacon eggs cheese { 
egen `word' = incss(meal), sub(`word') insensitive 
} 
+0

這太棒了 - 謝謝!你知道我在哪裏可以找到egenmore包嗎? – kathystehl

+1

該信息是隱含的:您可以從SSC存檔安裝它。 (儘管我喜歡'incss()' - 實際上我寫了它 - 這裏有替代方案,我會單獨回答。) –

+0

@NickCox我是STATA的新手,因此管理工具的後勤工作非常棘手。我要求澄清,因爲我知道其他新人也有此困難。感謝您的進一步信息。 http://repec.org/docs/ssc.php是一個包含感興趣的模塊的鏈接。要獲得軟件包,請在STATA中輸入「ssc install egenmore」。 – kathystehl

3

內置的strpos()將一個字符串是否是內部的另一個發現得正值。以此爲基礎

gen breakfast = strpos(meal, "bacon") | strpos(meal, "eggs") 

等等。實際上,使用小寫字符串進行處理通常會有所幫助,或者確實非常重要。另外,如果你有一個長列表,你可能更喜歡

gen breakfast = 0 
quietly foreach thing in bacon eggs cereal "orange juice" { 
     replace breakfast = breakfast | strpos(lower(meal), `"`thing'"') 
} 

這裏的原理是使用| (或)作爲邏輯運算符,如果任何參數非零,則產生1(真)。請注意,包含lower()是爲了與原始版本的小寫版本進行比較。

這種技術自然不會對拼寫錯誤或措辭中的細微變化強健。

+0

+1這是一個很好的命令,我不知道它 – 2014-03-04 12:19:35

+0

謝謝。 strpos()是嚴格的函數,在Stata中的功能和命令是不相交的,讓一些更習慣於其他語言的用戶感到意外和/或惱怒。 –

相關問題