【问题标题】:Subsetting SAS data set by earliest date for each subject按每个主题的最早日期对 SAS 数据集进行子集化
【发布时间】:2023-03-09 14:06:01
【问题描述】:

我正在尝试根据每个特定主题的事件的最早实例检索 SAS 数据集的子集。 这是一个示例数据集:

subject    date
001        12/22/2009
001        01/14/2016
001        03/20/2014
002        02/12/2007
002        01/23/2015

我只想要以下内容:

subject    date
001        12/22/2009
002        02/12/2007

【问题讨论】:

    标签: date sas


    【解决方案1】:

    通过first. 使用副处理:

    /* 按顺序排序 */ proc排序数据=有; 按主题日期; 跑 ; /* 为每个主题记录第一条记录(即最早的日期)*/ 数据要; 设置有; 按主题; if first.subject ; 跑 ;

    【讨论】:

      【解决方案2】:

      通过proc sql可以如下图所示

       proc sql;
       create table want as
       select * from have
       group by subject
       having date=min(date);
      

      或者你可以使用proc方式

         proc means data=have  nway;
         class subject;
         var date;
        output out=want(keep =id date) min(date) =date;
        run;
      

      【讨论】:

        【解决方案3】:

        @Kiran 的 PROC MEANS 示例将是我的首选方法,稍作修改以在 OUTPUT 语句中使用 IDGROUP 选项。它的工作方式与“选择的解决方案”基本相同,但不需要排序。我将日期变量修改为 iso8601 字符格式以表明 IDGROUP 也支持字符变量。

        data have;
           infile cards firstobs=2;
           input subject:$3. date:mmddyy.;
           dtc = put(date,yymmdd10.);
           random = ranuni(134);
           format date date9.;
           cards;
        subject    date
        001        03/20/2014
        002        02/12/2007
        001        01/14/2016
        001        12/22/2009
        002        01/23/2015
        ;;;;
           run;
        proc print;
           run;
        proc summary data=have nway;
           class subject;
           output out=want(drop=_type_) idgroup(min(dtc) obs out(date--random)=);
           run;
        proc print;
           run;
        

        【讨论】:

          猜你喜欢
          • 2015-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-29
          相关资源
          最近更新 更多