我的数据包含可能存在或不存在所有值的ID。我想删除只有没有数据的观察结果;如果有甚至一个值的观察,我想保留它们。例如,如果我的数据集是:
ID val1 val2 val3 val4
1 23 . 24 75
2 . . . .
3 45 45 70 9
我想只丢弃ID 2,因为它是唯一没有数据的ID - 只是一个ID。
我曾尝试使用Statalist和Google,但无法找到相关内容。
答案 0 :(得分:7)
只要它们为空, 也会使用字符串:
ds id*, not
egen num_nonmiss = rownonmiss(`r(varlist)'), strok
drop if num_nonmiss == 0
这将获得一个不是id的变量列表,并删除任何只有id的观察结果。
答案 1 :(得分:4)
Brian Albert Monroe非常正确,任何使用dropmiss
(SJ)的人都需要先安装它。由于有兴趣以不同的方式解决这个问题,我将添加另一个。
foreach v of var val* {
qui count if missing(`v')
if r(N) == _N local todrop `todrop' `v'
}
if "`todrop'" != "" drop `todrop'
虽然它应该是Brian的答案下的评论,但我会在这里添加评论,因为(a)这种格式更适合显示代码(b)评论来自我上面的代码。我同意unab
是一个有用的命令,并经常在公开场合给予赞扬。然而,这里没有必要,因为Brian的循环很容易就像
foreach v of var * {
2015年9月更新:有关missings
的信息,请参阅http://www.statalist.org/forums/forum/general-stata-discussion/general/1308777-missings-now-available-from-ssc-new-program-for-managing-missings,两位作者认为dropmiss
是对drop
的改进。当且仅当缺少所有值时,missings dropobs
观察的语法为{{1}}。
答案 2 :(得分:0)
只是另一种方法,它可以帮助您发现灵活的本地宏,而无需为Stata安装任何额外的东西。我很少看到使用本地存储命令或逻辑条件的代码,尽管它通常非常有用。
// Loop through all variables to build a useful local
foreach vname of varlist _all {
// We don't want to include ID in our drop condition, so don't execute the remaining code if our loop is currently on ID
if "`vname'" == "ID" continue
// This local stores all the variable names except 'ID' and a logical condition that checks if it is missing
local dropper "`dropper' `vname' ==. &"
}
// Let's see all the observations which have missing data for all variables except for ID
// The '1==1' bit is a condition to deal with the last '&' in the `dropper' local, it is of course true.
list if `dropper' 1==1
// Now let's drop those variables
drop if `dropper' 1==1
// Now check they're all gone
list if `dropper' 1==1
// They are.
现在dropmiss
在您下载并安装后可能会很方便,但如果您正在编写要由其他人使用的文件,除非他们也安装了dropmiss
,代码不能在他们的机器上工作。
使用这种方法,如果删除注释行和两个不必要的列表命令,这是一个相当稀疏的5行代码,它将与Stata开箱即用。