我有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个观察结果,因此我希望一次完成所有操作。
答案 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中搜索replace
和AUS
。
当然,这只是一种方法,如果您有许多替换值,可能并不理想。
根据对此答案的评论,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"
或再次使用substr
和cond
:
gen idd = cond(substr(v2,-2,.) == "_3", "AUS", cond(substr(v2,-2,.) == "_2", "BRA",""))
同样,这只是一种让人想起的方式。您可能也有兴趣查看regexm
以及help string_functions