Stata - 子集:检测Stata

时间:2015-12-07 21:00:54

标签: excel-vba stata vba excel

这个问题基本上与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

这个想法很简单。例如,如果值5var1)出现在var2中包含的所有值的集合中,我想创建var3并坚持"yes" (在[{1}}中var3旁边的新创建的5)和var1。例如,"no""no")旁边会有一个var3(在新创建的7中)因为var1不属于任何一个7中包含的值。

2 个答案:

答案 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可能明显快于循环。