【问题标题】:Looping to search string variables with local list循环使用本地列表搜索字符串变量
【发布时间】:2017-04-20 21:33:32
【问题描述】:

我正在处理很长的商品名称列表 (var1)。如果 var1 包含某些关键字,我想通过创建等于 1 的第二个变量 (var2) 从该列表中提取信息。

我正在使用以下代码:

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 运算符。

【问题讨论】:

    标签: string loops stata


    【解决方案1】:

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

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

    【讨论】:

    • 尼克考克斯:谢谢你的帮助。这非常有效,可以节省大量时间。我似乎无法标记,但如果我想避免字符串部分,你有什么建议吗?正如你所说,假设 oybean 不匹配我不想包含的任何内容,它会简化为 "gen soy = strpos(var1, "oybean") > 0。如果字符串 "fancy soy" 对我不感兴趣怎么办但是一个写着“花式大豆和大豆”的字符串是有趣的(因为“普通”大豆)?
    • 一种方法是查看从字符串中删除fancy soybeans 后剩下的内容。您不必更改变量,只需处理 subinstr(var1, "fancy soybeans", "", .)
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2014-08-30
    • 2012-10-28
    • 2017-04-30
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多