2015-10-14 26 views
1

我有幾個不同的數據集,每個我只需要保留一個變量列表。但是,當我運行一個簡單的keep命令時,由於不是我提供的列表中的所有變量都存在於每個數據集中,所以最終出現錯誤。有沒有解決這個問題的簡單方法,比如說,我錯過了keep的選項?如果沒有,是否有一種方法可以將每個數據集定義爲keep中的變量列表僅僅是來自此主列表中當前數據集中的變量列表?有沒有辦法只保留列表中的變量,而忽略數據集中不存在的列出的變量?

謝謝大家。我剛剛開始使用Stata(以前爲R),所以有時候我仍然陷入R方式看待事物。我會很感激任何提示。

+0

我也想知道這一點。 – Frank

+1

'isvar'(SSC)將名單過濾爲變量和其他名稱的列表。 –

回答

2

通過在ander2ed的答案上進行擴展,您可以定義要保留的變量的「主列表」,然後僅保留來自不同數據集的匹配變量 - 例如

local keepvars = "make weight mpg length" 

sysuse auto, clear // contains the four variables above (and others) 
qui ds 
local dsvars `r(varlist)' 
local keeplist : list keepvars & dsvars 
di "`keeplist'" 
keep `keeplist' 

sysuse autornd, clear // contains only make, weight, & mpg 
qui ds 
local dsvars `r(varlist)' 
local keeplist : list keepvars & dsvars 
di "`keeplist'" 
keep `keeplist' 

如果需要的話,這可以相當容易地製作成一個循環:

// loop approach 
local keepvars = "make weight mpg length" 
local dslist = "auto autornd" 
foreach ds of local dslist { 
    qui sysuse `ds', clear 
    qui ds 
    local dsvars `r(varlist)' 
    local keeplist : list keepvars & dsvars 
    keep `keeplist' 
    di as input ">>> `ds'" 
    ds 
    // save 
} 
+0

很好的例子。所以禮節可能需要更多時間給原始答案增加例子。我傾向於說你應該編輯它們,但顯然這是對http://meta.stackoverflow的皺眉。com/questions/261221/edit-to-add-example-rejected-how-can-i-improve – Frank

2

我會建議使用describe和一些擴展宏功能的組合。假設你有兩個你想比較的.dta文件,set1和set2。

然後,您可以做線沿線的東西:

describe set1, varlist 
local set1vars `r(varlist)' 

describe set2, varlist 
local set2vars `r(varlist)' 

local both : list set1vars & set2vars 

這將創建一個本地宏,both,其中包含與存在於兩個數據集的變量名的字符串。在keep命令中使用此宏,以僅在keep中存在兩個集合中的變量。

更詳盡的例子看起來是這樣的:

local keeplist "make mpg foreign price" 

/* Describe auto dataset */ 
describe using "C:/Program Files (x86)/Stata13/ado/base/a/auto.dta", varlist 
local setlist1 `r(varlist)' 

local keep : list keeplist & setlist1 

tempfile auto 
use `keep' using "C:/Program Files (x86)/Stata13/ado/base/a/auto.dta" 
save `auto' 

describe using "C:/Program Files (x86)/Stata13/ado/base/a/autornd.dta", varlist 
local setlist2 

local keep : list keeplist & setlist2 

use `keep' using "C:/Program Files (x86)/Stata13/ado/base/a/autornd.dta", clear 

/* Do whatever you want with now similar datasets */ 
* i.e., 
merge 1:1 make using `auto' 

注意,在上面的例子可以發出對數據describe無需讀取到內存中。從這個邏輯開始,就像@Brendan Cox所說的那樣,把它併入一個循環是很容易的。

其他選項涉及unabcfvars(可從ssc獲得)。

有關該主題的更多討論,請參見類似問題here

+1

完全正確 - 以前沒有足夠的時間提供完整的答案。請參閱編輯以獲得更完整的示例。 – ander2ed

1

到布倫丹的答案類似,您可以使用foreach循環創造當地人。您可以使用命令isvar,但我更願意只使用capture des並依賴返回碼。對於下面的例子,假設所有我們感興趣的變量都是「a,b,c,d」

forval n = 1/2{ 
     use data_set_`n', clear 
     foreach potential_var in a b c d{ 
     capture qui des `a' 
     if _rc == 0{ 
      local keep_list "`keep_list'" `a' 
     } 
     } 
     keep `keep_list' 
     save data_set_`n'_kept, replace 
    } 
+0

'confirm var'是這種方法中'describe'的替代方法。 –

相關問題