2014-08-29 97 views
0

一組變量和順序從SAS數據和變量id識別人year從2000 - 2010年由年設定的條件中進行觀察的SAS,我想創建一個新的數據集通過放棄在原始數據集中未觀察到的那些個體至少三個連續年。通過依賴於多年

這裏是原始數據集的樣子:

id year 
1 2002 
1 2003 
1 2004 
1 2005 
1 2006 
2 2000 
2 2002 
2 2003 
2 2005 
2 2007 
2 2009 
2 2010 
3 2000 
3 2002 
3 2003 
3 2004 
3 2007 
3 2009 
3 2010 

一個人不一定在每一個11年的觀察。就此而言,上述數據集,我想刪除其中id = 2的觀察值。

+0

爲什麼要放棄身份證2.它已連續四年(2002,2003,2004和2005年)? – Linger 2014-08-29 13:29:18

+0

我寫了一個錯誤的例子數據。我會糾正這一點。謝謝 – Duna 2014-08-29 13:36:07

回答

1

以下SQL Fiddle顯示如何確定哪些id的有記錄有連續三年:

PROC SQL; 
    SELECT DISTINCT t1.ID 
    FROM MyTable t1 
    INNER JOIN MyTable t2 ON t1.id = t2.id AND t1.year = t2.year + 1 
    INNER JOIN MyTable t3 ON t2.id = t3.id AND t2.year = t3.year + 1; 
QUIT; 

要獲取所有數據使用SQL Fiddle

PROC SQL; 
    SELECT * 
    FROM MyTable 
    WHERE ID IN 
    (
    SELECT t1.ID 
    FROM MyTable t1 
    INNER JOIN MyTable t2 ON t1.id = t2.id AND t1.year = t2.year + 1 
    INNER JOIN MyTable t3 ON t2.id = t3.id AND t2.year = t3.year + 1 
); 
QUIT; 
+0

我的數據集是SAS格式,我想在SAS中執行此操作。我應該使用自己的數據集更改MyTable後,在SAS中運行代碼嗎?我完全陌生於SAS – Duna 2014-08-29 14:25:32

+0

我對SAS並不熟悉。我所能說的只是試一試。它不應該傷害任何東西,因爲它只是一個簡單的SELECT語句。 – Linger 2014-08-29 14:34:51

+2

要在SAS中運行SQL,請將其包裝在'PROC SQL; <你的sql在這裏> QUIT;'。是的,將MyTable更改爲您的數據集的名稱。此外,如果您不知道如何使用SQL解決方案,請不要將[tag:sql]標記添加到您的問題中... – Joe 2014-08-29 14:42:04

2

SQL肯定能做到這一點,但SAS可以更輕鬆地做到這一點(沒有連接)。這假定它是按照id和year來提前排序的,就像你的例子一樣,沒有你需要的排序。
這基本上是一次性解決方案(它只在這裏讀取一次數據,除非您有一個ID的記錄超過了緩衝存儲器的容量,但在本例中不太可能)。

這是雙DoW循環的示例,它首先檢查某個條件的一個ID組中的行,然後再次遍歷它們以輸出限定ID行。

data have; 
input id year; 
datalines; 
1 2002 
1 2003 
1 2004 
1 2005 
1 2006 
2 2000 
2 2002 
2 2003 
2 2005 
2 2007 
2 2009 
2 2010 
3 2000 
3 2002 
3 2003 
3 2004 
3 2007 
3 2009 
3 2010 
;;;; 
run; 

data want; 
do _n_=1 by 1 until (last.id); 
    set have; 
    by id; 
    yrdif=dif(year); 
    if yrdif=1 then cons_yr=cons_yr+1; 
    else cons_yr=1; 
    max_cons = max(cons_yr,max_cons); 
end; 
do _n_=1 by 1 until (last.id); 
    set have; 
    by id; 
    if max_cons ge 3 then output; 
end; 
run;