楼主: tangliang0905
1735 4

还是有一个关于标注时间间隔的问题 [推广有奖]

  • 1关注
  • 3粉丝

讲师

52%

还不是VIP/贵宾

-

威望
0
论坛币
1137 个
通用积分
0.5583
学术水平
13 点
热心指数
20 点
信用等级
11 点
经验
30311 点
帖子
212
精华
0
在线时间
836 小时
注册时间
2012-11-29
最后登录
2024-7-23

楼主
tangliang0905 发表于 2015-9-4 06:22:12 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在有一个标注时间间隔的问题,

IDDate
A1/1/2015
A1/3/2015
A1/11/2015
A1/14/2015
A1/15/2015
A1/31/2015
A2/1/2015
A2/2/2015
A3/1/2015


数据如上,理论上同一个ID在10天之内不能出现三次,一旦出现三次的话,这个三个数据都要被标注(比如加一个FLAG =1),而数据自动跳转到下一个待检验的数据。

所以,根据上面数据,
第一步检查第一条数据,A是1月1号,然后找到它的第三条记录是1月11号,已经在10天之外了,所以第一条不需要被标注(FLAG=0 或者空值)。

再看第二条记录,是1月3号,同样的它对应的第三条记录是1月14号,所以它也不需要被标注,

第三条记录是1月11号,它的第三条记录是1月15号,已经在10天之内,所以,1月11号,1月14号,1月15号同时被标注(FLAG=1),直接跳到下一条记录。

下一条记录是1月31号,同样道理,2/1,2/2也同时被标注

跳到下一条记录也就是3/1号,因为它只有一条,不满足10天之内三条记录(没有下面的了),所以也没有被标注,所以应该得到下面的结果

IDDateFlag
A1/1/2015.
A1/3/2015.
A1/11/2015

1

A1/14/2015

1

A1/15/2015

1

A1/31/2015

1

A2/1/2015

1

A2/2/2015

1

A3/1/2015.


不知道这样的情况,用SAS的怎么实现,觉得肯定使用LAG function,但是下一步就不知道怎么开始了,感谢大家的帮助啊

二维码

扫码加我 拉你入群

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

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

关键词:时间间隔 function Flag date sas的 记录

沙发
忍冬的秋 发表于 2015-9-4 13:01:52
是这样吗?
data a;
infile 'C:\360Downloads\test5.csv' missover dsd firstobs=2;
input id $ date : mmddyy10.;
format date yymmdd10.;
run;
proc sort data=a out=b;
by id date;
run;

proc sql noprint;
create table union as
(
select
t1.*,
t2.date as new_date
from work.b t1
left join
work.b t2
on trim(t1.id) = trim(t2.id)
and t2.date < t1.date+10
and t2.date > t1.date)
order by t1.id,t1.date,t2.date;
quit;
run;

proc sql noprint;
create table final as
(select
id,
date
from work.union
group by id,date
having count(distinct new_date) >= 2);
quit;

proc sql noprint;
create table aa as
(select
t1.*,
t2.new_date
from work.final t1
left join
work.union t2
on trim(t1.id) = trim(t2.id)
and
t1.date=t2.date);
quit;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
teqel + 3 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 3  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

藤椅
18129380375 学生认证  发表于 2015-9-4 19:20:04
忍冬的秋 发表于 2015-9-4 13:01
是这样吗?
data a;
infile 'C:\360Downloads\test5.csv' missover dsd firstobs=2;
关于日期型数据,sas认为是字符型的,如何才能进行比较运算呢。

板凳
teqel 发表于 2015-9-4 21:21:01
Try this
  1. data a;
  2. input ID $ Date mmddyy10.;
  3. FORMAT DATE mmddyy10.;
  4. cards;
  5. A 1/1/2015
  6. A 1/3/2015
  7. A 1/11/2015
  8. A 1/14/2015
  9. A 1/15/2015
  10. A 1/31/2015
  11. A 2/1/2015
  12. A 2/2/2015
  13. A 3/1/2015
  14. B 1/1/2015
  15. B 1/3/2015
  16. B 1/11/2015
  17. B 1/14/2015
  18. B 1/15/2015
  19. B 1/31/2015
  20. B 2/1/2015
  21. B 2/2/2015
  22. B 3/1/2015
  23. ;
  24. run;

  25. PROC SORT DATA=A;
  26. BY ID DATE;
  27. RUN;

  28. DATA B;
  29. SET A;
  30. SET A(FIRSTOBS=3 RENAME=(ID=ID1 DATE=DATE1));
  31. IF ID=ID1 AND DATE1-DATE<10;
  32. FLAG=1;
  33. RUN;

  34. PROC SQL;
  35. CREATE TABLE C AS
  36. SELECT DISTINCT A.*, B.FLAG
  37. FROM A LEFT JOIN B ON A.ID=B.ID AND A.DATE BETWEEN B.DATE AND B.DATE1;
  38. RUN;
复制代码

报纸
teqel 发表于 2015-9-4 21:29:26
18129380375 发表于 2015-9-4 19:20
关于日期型数据,sas认为是字符型的,如何才能进行比较运算呢。
Change to num first:

input(date, mmddyy10.)

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 16:53