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
可能比循环快得多。
基本上与这个问题包含的问题相同,但在 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
可能比循环快得多。