问题描述
我有一个 dta 文件,其中包含数百万个观察值,大约有 4 个变量。我只想查看此数据的一个子集,其中变量 username
包含在包含数百个用户名的列表中。我有两个 .dta 文件。一个有完整的数据集,另一个有“名册”,其中包含我想专门查看的用户名。
查看Stata文档,似乎我想使用keep if exp
,但我不知道该表达什么。如果不从我的工作空间中清除主数据集,我什至无法将花名册加载到 Stata 中。如何在不清除主文档的情况下引用这个单独的 dta 文档?
解决方法
最简单的方法是keep if inlist(username,"user1","user2",...)
。问题是,inlist()
只允许最多 10 个字符串值进行比较。如果你有更多,你必须merge
,或者使用正则表达式。
假设我们有这个数据集,保存为 all_users.dta:
input str6 username
"user_a"
"user_b"
"user_c"
"user_d"
"user_e"
"user_f"
"user_g"
"user_h"
"user_i"
"user_j"
"user_k"
"user_l"
"user_m"
"user_n"
"user_o"
"user_p"
"user_q"
"user_r"
"user_s"
"user_t"
end
我们还有第二个数据集,保存为 usernames.dta:
input str6 username
"user_a"
"user_b"
"user_c"
"user_d"
"user_e"
"user_f"
"user_g"
"user_h"
"user_i"
"user_j"
"user_k"
"user_l"
"user_m"
"user_n"
"user_o"
end
那么这将是两种只保留用户名在 usernames.dta 中的 all_users.dta 观察的方法:
*** MERGE ***
clear
use all_users
merge m:1 username using usernames
keep if _merge == 3
*** REGEX ***
clear
use usernames
levelsof username,local(usernames)
use all_users,clear
// Create regular expression
foreach username of local usernames {
local regex `regex'|`username'
}
local regex `=substr("`regex'",2,.)'
keep if regexm(username,"^(`regex')$")
,
FAQ here 正是针对这个问题。 merge
数据集并保持 _merge
定义的交集为 3。
原则上您可以输入一个或多个定义 keep
条件的命令,但这是一个糟糕的解决方案
-
它既乏味又容易出错。
-
inlist()
带有字符串参数特别繁琐,如果这是解决方案的一部分。 (如果可以简洁地表达对keep
说的内容,可能会有更简洁的解决方案。) -
这是浪费时间和精力,因为您已经掌握了包含信息。