如果变量存在,如何保留它

How to keep a variable if it exists

假设我有这两个数据集:data1data2。它们是相同的,只是 data1 包含 make 变量而 data2 不包含。

sysuse auto2, clear
*create first dataset
preserve
tempfile data1
save `data1'
restore
*create second dataset
preserve
drop make
tempfile data2
save `data2'
restore

我的问题很简单。我只想编写代码,以便保留某些变量 如果它们存在 并且如果不存在则保留更有限的集合。请注意,在我的应用程序中,删除变量不太可行。我需要使用 keep。

在我的玩具示例中,我想为拥有它的数据集(即 data1)保留 pricemake,而只为包含它的数据集保留 price没有make(即data2)。

这不起作用,因为如果给定变量不在数据集中,keep 将失败:

forvalues i=1/2 {
    use `data`i'', clear
    keep price make
}

有什么建议吗?我想知道是否有某种方法可以使用 if+else 语句来测试变量 make 是否存在,然后执行 keep price makekeep price。或者可能是使用 capture keep price make 的某种方式,然后根据是否失败,转到 keep price。这些方法或任何其他方法是否有效?

这是一种方法:获取存在的变量列表,并查找这些变量与所需变量集的交集。

您的暂定代码对 save 结果没有任何影响。这里我覆盖了刚刚读入的数据集;您的应用程序可能(确实应该)希望 save 它到一个新文件。

forvalues i=1/2 {
    use `data`i'', clear
    unab present : * 
    local wanted price make 
    local available : list present & wanted 
    keep `available' 
    save, replace 
}

另见例如isvar 来自 SSC,尤其是 capture confirm var.