通过依赖于组变量和年份序列的条件来降低SAS中的观察结果

时间:2014-08-29 13:25:35

标签: sql sas

从包含变量id SAS 数据集中识别人和{2000}到2000年的year,我想通过删除这些数据来创建新的数据集在原始数据集中未观察到至少连续三年<连续年的个体。

以下是原始数据集的内容:

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的观察结果。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;