我正在尝试仅为最近的访问提取所有时间事件。有人可以帮我提供代码吗。
这是我的数据:
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
答案 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;
即使date
和time
不在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;