2014-08-29 59 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;