楼主: bohecaosun
1791 2

怎样寻找数据中连续三天的子数据集 [推广有奖]

  • 0关注
  • 0粉丝

学前班

90%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
36 点
帖子
3
精华
0
在线时间
3 小时
注册时间
2014-7-2
最后登录
2014-7-14

楼主
bohecaosun 发表于 2014-7-14 15:19:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如题,data structure 是按照一个日期一条观测,需要找到连续三天的观测,求大神给个sample macro!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:寻找数据 找数据 数据集 Structure Sample structure

沙发
freerunning_sky 在职认证  发表于 2014-7-15 11:33:14
  1. data in;
  2.         input date test $;
  3.         format date ddmmyy10.;
  4.         informat date ddmmyy10.;
  5.         cards;
  6.         01/02/2014 a1
  7.         01/02/2014 a2
  8.         02/02/2014 b
  9.         03/02/2014 c1
  10.         03/02/2014 c2
  11.         05/02/2014 d
  12.         06/02/2014 e
  13.         07/02/2014 f1
  14.         07/02/2014 f2
  15.         08/02/2014 g
  16.         09/02/2014 h
  17.         11/02/2014 i
  18.         12/02/2014 j
  19.         14/02/2014 k
  20.         16/02/2014 l
  21.         18/02/2014 m
  22.         19/02/2014 n
  23.         20/02/2014 o
  24.         ;
  25.         proc sort;by date;
  26. run;

  27. data base_dt;
  28.         set in;
  29.         retain pdt ppdt;
  30.         if date-pdt=1 & pdt-ppdt=1 then output;
  31.         if ppdt<pdt then ppdt=pdt;
  32.         if pdt<date then pdt=date;
  33.         format pdt ppdt ddmmyy10.;
  34.         keep date;
  35.         proc sort nodupkey;by date;
  36. run;

  37. proc sql noprint;
  38.         create table out as
  39.         select distinct a.* from in a
  40.         inner join base_dt b on b.date-a.date>=0 & b.date-a.date<=2;
  41. quit;
复制代码

藤椅
bobguy 发表于 2014-7-28 04:43:39
A simple SQL will do it if a data set is small. The first solution is slight better.

Both solutions involve a Cartesian product join which will cause a performance issue if the data set has more than 10 thousands  rows. If this is a case, a more efficient way will be a data step.


data tmp;
/*   do date='1jan1980'd to '31jan2014'd;*/
   do date='1jan2014'd to '31jan2014'd;
      if ranuni(123)>0.3 then output;
        end;
        format date yymmdd10.;
run;


proc sql;
  create table tmp2 as
  select a.date , b.date as date2
  from tmp a join tmp b on (b.date=a.date or b.date=a.date+1 or b.date=a.date+2)
  group by 1
  having count(a.date)=3
  order by 1,2
  ;
  quit;

proc sql;
  create table tmp2 as
  select a.date , b.date as date2
  from tmp a , tmp b
  where 0<=(b.date-a.date)<=2
  group by 1
  having count(a.date)=3
  order by 1,2
  ;
  quit;


您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 21:27