SAS中的平衡面板数据到平衡面板数据

SAS中的平衡面板数据到平衡面板数据,sas,Sas,在SAS 9.2中,我目前正在使用面板数据集。我有一个变量表示年份,一个变量表示个人。有些人并不是每年都出现,我想把这些观察结果去掉。它的简化版本如下所示: 人年 2008年1月 2009年1月 2010年1月 2008年2月 2010年2月 2008年3月 2009年3月 2010年3月 所以在这种情况下,我想保留第1个和第3个人物,或者说其他,我想删除第二个人物,因为他不是每年都出现 我希望这是有意义的 谢谢我认为最简单的方法是在PROC SQL中使用子查询进行查询: data have;

在SAS 9.2中,我目前正在使用面板数据集。我有一个变量表示年份,一个变量表示个人。有些人并不是每年都出现,我想把这些观察结果去掉。它的简化版本如下所示:

  • 人年
  • 2008年1月
  • 2009年1月
  • 2010年1月
  • 2008年2月
  • 2010年2月
  • 2008年3月
  • 2009年3月
  • 2010年3月
  • 所以在这种情况下,我想保留第1个和第3个人物,或者说其他,我想删除第二个人物,因为他不是每年都出现

    我希望这是有意义的


    谢谢

    我认为最简单的方法是在PROC SQL中使用子查询进行查询:

    data have;
        input person year;
        datalines;
    1 2008
    1 2009
    1 2010
    2 2008
    2 2010
    3 2008
    3 2009
    3 2010
    ;
    run;
    
    proc sql noprint;
        create table want as
        select *
        from have
        where person in
            (select person
            from have
            group by person
            having min(year)=2008 and max(year)=2010 and count(distinct year)=3);
    quit;
    

    如果整个数据集的最小年数和最大年数是固定的,则可以删除HAVING子句中的前两个条件,并只保留COUNT(DISTINCT…。

    数据步骤解决方案,其功能与SQL几乎相同:

    data have;
        input person year;
        datalines;
    1 2008
    1 2009
    1 2010
    2 2008
    2 2010
    3 2008
    3 2009
    3 2010
    ;
    run;
    data want;
    do _n_ = 1 by 1 until (last.person);
      set have;
      by person;
      if year ge 2008 and year le 2010 then yearcount+1;
    end;
    do _n_ = 1 by 1 until (last.person);
      set have;
      by person;
      if yearcount=3 then output;
    end;
    yearcount=0;
    run;