首页 > 解决方案 > 有没有办法让数据集中的观察结果以它们在某个列表中为条件?

问题描述

我有一个包含数百万个观察值的 dta 文件,其中包含大约 4 个变量。我只想查看这些数据的一个子集,其中的变量username包含在几百个用户名的列表中。我有两个 .dta 文件。一个有完整的数据集,另一个有“名册”,其中包含我要专门查看的用户名。

翻阅Stata文档,似乎我想使用keep if exp但我不知道该表达什么。如果不从我的工作空间中清除主数据集,我什至无法将名册加载到 Stata。如何在不清除主文档的情况下引用此单独的 dta 文档?

标签: stata

解决方案


最简单的方法是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')$")

推荐阅读