这个问题基本上与Stata和整数值中包含的问题相同。 (fastest way to detect if a value is in a set of values in Javascript)
在Stata中运行以下代码:
set obs 9
generate var1 = 1 in 1
replace var1 = 2 in 2
replace var1 = 3 in 3
replace var1 = 4 in 4
replace var1 = 5 in 5
replace var1 = 6 in 6
replace var1 = 7 in 7
generate var2 = 6 in 1
replace var2 = 5 in 2
replace var2 = 4 in 3
replace var2 = 3 in 4
replace var2 = 2 in 5
replace var2 = 1 in 6
replace var2 = 58 in 7
replace var2 = 69 in 8
replace var2 = 51 in 9
这个想法很简单。例如,如果值5
(var1
)出现在var2
中包含的所有值的集合中,我想创建var3
并坚持"yes"
(在[{1}}中var3
旁边的新创建的5
)和var1
。例如,"no"
("no"
)旁边会有一个var3
(在新创建的7
中)因为var1
不属于任何一个7
中包含的值。
答案 0 :(得分:0)
如果我理解的话,执行此操作的强力方法是:
gen var3="no"
local N=_N
forval i=1/`N' {
replace var3 = "yes" if var1 == var2[`i']
}
如果您不熟悉当前的数据结构,那么循环遍历您正在寻找的所有值会更有效:
gen var3="no"
foreach i in 1 2 3 4 5 6 58 69 51 {
replace var3 = "yes" if var1==`i'
}
答案 1 :(得分:0)
如果循环以某种方式难以构造,则另一种方法是使用合并:
clear
input float(var1 var2)
1 6
2 5
3 4
4 3
5 2
6 1
7 58
. 69
. 51
end
tempfile original
save `original' * Save data (presumably you have this on disk already)
drop var1 * Keep only the key variable for the merge
rename var2 var1 * Rename for merge
tempfile set2
save `set2' * save file with only values from var2 in original set
use `original', clear
merge m:1 var1 using `set2'
drop if _merge == 2 * Drop new observations created for values only in var2
list, sepby(_merge)
在这里,您会注意到merge
期间创建的_merge变量包含var2中var1的哪些值存在的信息。从这一点来看,destring
有点微不足道,并将值更新为“是”和“否”,或者根据_merge的值创建一个新变量。
另请注意,如果您拥有大型数据集,则merge
可能明显快于循环。