Stata - 子集:检测一个值是否在 Stata 中的一组值中的最快方法

Stata - Subsetting: Fastest way to detect if a value is in a set of values in Stata

基本上与这个问题包含的问题相同,但在 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" (在新创建的 var3 中)在 var1 中的 5 旁边,否则 "no"。例如,在 7(在 var1 中)旁边会有一个 "no"(在新创建的 var3 中),因为 7 不在任何var2.

中包含的值

如果我理解正确的话,一个暴力破解的方法是:

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

如果循环在某种程度上难以构建,另一种方法是使用合并:

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 变量包含有关 var1 的哪些值存在于 var2 中的信息。从这一点来看,destring 并将值更新为 "yes" 和 "no",或者创建一个以 _merge.

的值为条件的新变量有点微不足道。

另请注意,如果您的数据集很大,merge 可能比循环快得多。