微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法将数据集中的观察结果保留在某个列表中?

如何解决有没有办法将数据集中的观察结果保留在某个列表中?

我有一个 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 条件的命令,但这是一个糟糕的解决方案

  1. 它既乏味又容易出错。

  2. inlist() 带有字符串参数特别繁琐,如果这是解决方案的一部分。 (如果可以简洁地表达对 keep 说的内容,可能会有更简洁的解决方案。)

  3. 这是浪费时间和精力,因为您已经掌握了包含信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。