循环以替换值

时间:2016-04-22 15:32:28

标签: loops replace stata

我有343次观察,我正在尝试以下方法:

forvalues in 1/343 {
    replace `ido'="BRA" if `v2'=="F_3idoXidd_2_*"
    replace `ido'="AUS" if `v2'=="F_3idoXidd_3_*"
}

*中的F_3idoXidd_2_*是因为我对每个国家/地区都有30个观察结果,因此我希望一次完成所有操作。

1 个答案:

答案 0 :(得分:1)

您通常不需要循环来替换变量值。通常,Stata中的循环不用于迭代观察,而是用于某种类型的列表(varlist,numlist等)。

此外,您对通配符的使用不会像您期望的那样起作用。在指定varlist(drop var*sum gdp*等)时,通常也会使用通配符。

您可以在此处执行的操作是使用strpos在变量中搜索指定的字符串,并以strpos的结果为条件替换其值。例如:

/* Create sample data */
clear *
input str15 v2
"F_03idoXidd_3_3"
"F_03idoXidd_2_3"
"F_03idoXidd_3_2"
"F_03idoXidd_2_2"
end
expand 50
gen ido = ""

replace ido = "AUS" if strpos(v2,"F_03idoXidd_3_")
replace ido = "BRA" if strpos(v2,"F_03idoXidd_2_")

或,一线解决方案:

replace ido = cond(strpos(v2,"F_03idoXidd_3_"), "AUS", cond(strpos(v2,"F_03idoXidd_2_"),"BRA",""))
如果找不到指定的字符串,则

strpos返回0,否则返回首先找到的位置。在if限定符后使用,如果>它被评估为true 0,否则为false。在这种情况下,您可以使用F_3idoXidd_3_在v2中搜索replaceAUS

当然,这只是一种方法,如果您有许多替换值,可能并不理想。

修改

根据对此答案的评论,OP需要根据字符串中最后一个整数的值创建第二个变量。

执行此操作的一种方法依赖于substr,并假设字符串的F_3idoXidd_部分不会在观察中发生变化,因为不同的值(例如F_4idoXidd_3_2)会与F_3idoXidd_3_2具有不同的含义。

gen idd = ""
replace idd = "AUS" if substr(v2, -2,.) == "_3"
replace idd = "BRA" if substr(v2, -2,.) == "_2"

或再次使用substrcond

的单行解决方案
gen idd = cond(substr(v2,-2,.) == "_3", "AUS", cond(substr(v2,-2,.) == "_2", "BRA",""))

同样,这只是一种让人想起的方式。您可能也有兴趣查看regexm以及help string_functions

中记录的任意数量的函数
相关问题