有没有办法根据给定字符串变量中存在的关键字对二进制变量进行编码?简单的例子:
我有一个描述各种膳食的字符串变量和一个表示给定膳食是否是早餐的虚拟变量。有什么办法编码吗
早餐 = 1 如果餐== [那么有些话说包含鸡蛋、培根等]
这是一个愚蠢的例子,但我更感兴趣的是根据字符串数据中的信息确定编码二进制变量的快捷方式。
如果在另一个字符串中找到一个字符串,则内置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(true)。请注意,包含lower()
是为了与原始版本的小写版本进行比较。
这种技术自然不能很好地处理拼写错误或措辞的微小变化。
你可以为此使用 egenmore 包的 incss 函数。
ssc install egenmore
egen bacon = incss(meal), sub(bacon) insensitive
这给了你一个等于 1 的假人,如果对于给定的观察,字符串变量"meal"包含单词培根。否则为零。选项不敏感告诉 Stata 不要考虑区分大小写(否则培根与培根不同)。据我所知,您一次只能搜索一个子字符串,但您可以轻松地为此编写一个循环:
foreach word in bacon eggs cheese {
egen `word' = incss(meal), sub(`word') insensitive
}