仅适用于最近发生的所有值

时间:2017-04-28 17:34:03

标签: sas

我正在尝试仅为最近的访问提取所有时间事件。有人可以帮我提供代码吗。

这是我的数据:

python

我需要输出为:

Obs   Name      Date       Time  

 1    Bob       2017090    1305  
 2    Bob       2017090    1015  
 3    Bob       2017081    0810  
 4    Bob       2017072    0602  
 5    Tom       2017090    1300  
 6    Tom       2017090    1010  
 7    Tom       2017090    0805  
 8    Tom       2017072    0607  
 9    Joe       2017085    1309  
10    Joe       2017081    0815  

现在我的代码只是为了给我一个最近的条目:

Obs  Name      Date       Time  

1    Bob       2017090    1305,1015    
2    Tom       2017090    1300,1010,0805
3    Joe       2017085    1309   

3 个答案:

答案 0 :(得分:0)

我首先按名称和日期对数据进行排序。然后我会转置并处理结果。

proc sort data=have;
by name date;
run;

proc transpose data=have out=temp1;
by name date;
var value;
run;

data want;
set temp1;
by name date;

if last.name;

format value $2000.;
value = catx(',',of col:);

drop col: _name_;
run;

您可能希望进一步处理新的VALUE以删除多余的逗号(,)和缺失值.

答案 1 :(得分:0)

question yesterday from another user非常相似,您可以在此处使用相当多的解决方案。

SQL再次是最简单的;这是有效的ANSI SQL,几乎只有SAS支持这一点,但它确实在SAS中有效:

proc sql;
  select name, date, time
    from have
    group by name
    having date=max(date);
quit;

即使datetime不在group by合法的SAS上,也不在select上,然后SAS会自动合并(内部联接)select name, max(date) from have group by name having date=max(date)到原始have数据集的结果,根据需要返回多行。然后你想要折叠行,我将这些行作为练习留给读者。

您还可以使用您选择的任何方法生成最大日期表,然后自行合并。这可能是最容易使用的,特别是包括故障排除。

DoW循环在这里也很吸引人。这基本上是上面SQL的精确SAS数据步骤实现。首先迭代该名称,找出最大值,然后再次迭代并输出具有该最大值的那些

proc sort data=have;
  by name date;
run;

data want;
  do _n_ = 1 by 1 until (last.name);
    set have;
    by name;
    max_Date = max(max_date,date);
  end;

  do _n_ = 1 by 1 until (last.name);
    set have;
    by name;
    if date=max_date then output;
  end;
run;

当然,您也可以更轻松地折叠行:

data want;
length timelist $1024;
  do _n_ = 1 by 1 until (last.name);
    set have;
    by name;
    max_Date = max(max_date,date);
  end;

  do _n_ = 1 by 1 until (last.name);
    set have;
    by name;
    if date=max_date then timelist=catx(',',timelist,time);
    if last.name then output;
  end;
run;

答案 2 :(得分:0)

如果数据已排序,则只保留第一个日期,以便您知道要合并和输出的记录。

proc sort data=have ;
  by name descending date time; 
run;
data want ;
  set have ;
  by name descending date ;
  length timex $200 ;
  retain start timex;
  if first.name then do;
    start=date;
    timex=' ';
  end;
  if date=start then do;
    timex=catx(',',timex,time);
    if last.date then do;
      output;
      call missing(start,timex);
    end;
  end;
  drop start time ;
  rename timex=time ;
run;