【问题标题】:SAS task. Need to pick records conditionallySAS 任务。需要有条件地选择记录
【发布时间】:2014-12-02 04:18:55
【问题描述】:

我有一个任务要解决,我对这种编程语言很陌生。当标志为 0 时,我必须选择下一个即时记录,假设标志变量有三个或更多连续记录的值为 1。 我已经研究了几个小时。下面是数据步。请提出建议。

data two;
input usubjid visit flag;
cards;
1001 1 1
1001 2 1
1001 3 0
1001 4 1
1001 5 1
1001 6 1
1002 1 1
1002 2 1
1002 3 0
1002 4 1
1002 5 1
1003 1 0
1003 2 1
1003 3 1
1003 4 1
1003 5 1
;
run;

输出将是:-

usubjid visit flag
1001     4     1

1003     2     1

这是我迄今为止尝试过的。

proc sort data = two ;
        by usubjid ;    
run;
  proc transpose data = two out = tran ;
        by usubjid ;
        id visit ;var flag ;
run;
data b ;
    set tran ;
    if ( ( _1 = _2 ) and ( _1 = _3 ) ) or ( ( _2 = _3 ) and ( _2 = _4 ) ) or ( ( _3 = _4 ) and (     _3 = _5 ) ) or
        ( ( _4 = _5 ) and ( _4 = _6 ) ) ;
run;
proc sort data = b ;
    by usubjid ;
run;
data c ;
    merge a ( in = a ) b ( in = b ) ;
    by usubjid ;
    if a ;                                                                
run;                                                                                   

【问题讨论】:

    标签: sas datastep


    【解决方案1】:

    这可能是最快和最简单的方法

    1. 在每个“0”之后计算连续的“1”,如果找到其中的 3 个,则继续 第二步。
    2. 回顾/回顾两条记录并提取它。
    3. 做显式输出。

      data two(keep=usubjid visit flag);
      set two;
      retain temp 0;
      
      if flag ne 0 then temp=temp+flag; else temp=0; 
      
      lag2_usubjid= lag2(usubjid);
      lag2_visit=lag2(visit);
      lag2_flag=lag2(flag);
      
      if temp=3 then do;
           usubjid=lag2_usubjid;
           visit=lag2_visit;
           flag=lag2_flag;
           output;
      end;        
      

      运行;

    【讨论】:

      【解决方案2】:

      好的。删除了我的旧答案,因为我不完全理解您在寻找什么。

      data two;
      set two;
      n = _n_;
      run;
      
      proc sort data=two;
      by descending n ;
      run;
      
      data two;
      set two;
      retain count  0;
      if flag then
          count = count + 1;
      else 
          count = 0;
      run;
      
      proc sort data=two;
      by n;
      run;
      
      data two (drop=count n);
      set two;
      
      if lag(flag) = 0 and count >=3;
      run;
      

      首先,我添加一个行号变量。

      然后按该值倒序排序。

      添加一个变量,用于计算 flag=1 的连续记录数。

      恢复原来的顺序。

      最后,根据您要查找的内容进行细分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        • 1970-01-01
        相关资源
        最近更新 更多