楼主: 小鳄鱼a
3329 17

如何设定日期间隔标记 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2014-10-29 20:59:40 |AI写论文
30论坛币

1

2001/3/27

-5

1

2001/3/28

-4

1

2001/3/29

-3

1

2001/3/30

-2

1

2001/3/31

-1

1

2001/4/1

0

0

1

2001/4/2

1

1

2001/4/3

2

1

2001/4/4

3

1

2001/4/5

4

1

2001/4/6

5

1

2001/4/7

1

2001/4/8

1

2001/4/9

1

2001/4/10






原数据如id date pubdate  ,现在想生成如w的变量,该怎样写

最佳答案

pobel 查看完整内容

proc sql; create table wanted as select l.*, case when abs(l.date-r.date)
关键词:date ATE BDA 如何

沙发
pobel 在职认证  发表于 2014-10-29 20:59:41
proc sql;
   create table wanted as
    select l.*,
           case when abs(l.date-r.date)<=5 then (l.date-r.date)
                    else .
                        end as w
                from test as l  left join
                         test(where=(pubdate=0)) as r
                        on l.id=r.id
         order by id,date;
quit;

藤椅
pobel 在职认证  发表于 2014-10-30 07:36:33

data wanted;
   merge test
         test(where=(_pubdate=0) rename=(date=_date pubdate=_pubdate));
   by id;
   w=ifn(abs(date-_date)<=5., date-_date, .);
   drop _:;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 4 + 4 + 4 精彩帖子

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

板凳
sniperhgy 发表于 2014-10-30 12:33:51
楼主你好,我也写了一段,请试试看:
  1. data _null_;
  2.   format obs_list $200.;
  3.   set temp end = eof;
  4.   retain obs_list "";
  5.   if pubdate = 0 then
  6.     obs_list = strip(obs_list) || strip(_N_) || strip(",") ;

  7.   if eof then
  8.     call symput("obs_list", substr(strip(obs_list), 1, length(strip(obs_list)) - 1));
  9. run;

  10. %put &obs_list.;

  11. data wanted;
  12.   set temp;

  13.   retain iCurrent 1;

  14.   if abs(_N_ - scan("&obs_list.", iCurrent, ",")) <= 5 then do;
  15.     w = _N_ - scan("&obs_list.", iCurrent, ",");
  16.     if w = 5 then do;
  17.       iCurrent = iCurrent + 1;
  18.     end;
  19.   end;
  20.   else
  21.     w = .;
  22.   drop iCurrent;
  23. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 4 + 4 + 4 精彩帖子

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

报纸
小鳄鱼a 发表于 2014-10-30 12:37:51
pobel 发表于 2014-10-30 07:32
proc sql;
   create table wanted as
    select l.*,
5314
5315   data wanted;
5316      merge test
5317            test(where=(_pubdate=0) rename=(date=_date pubdate=_pubdate));
ERROR: WHERE 子句运算符要求兼容的变量。
5318      by id;
5319      w=ifn(abs(date-_date)<=5., date-_date, .);
5320      drop _:;
5321   run;

NOTE: 由于出错,SAS 系统停止处理该步。
WARNING: 数据集 WORK.WANTED 可能不完整。该步停止时,共有 0 个观测和 4 个变量。
WARNING: 数据集 WORK.WANTED 由于该步已停止,而没有被替换。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒

地板
小鳄鱼a 发表于 2014-10-30 12:38:22
pobel 发表于 2014-10-30 07:36
data wanted;
   merge test
         test(where=(_pubdate=0) rename=(date=_date pubdate=_pubdate) ...
5322
5323
5324   proc sql;
5325      create table wanted as
5326       select l.*,
5327              case when abs(l.date-r.date)<=5 then (l.date-r.date)
5328                       else .
5329                           end as w
5330                   from test as l  left join
5331                            test(where=(pubdate=0)) as r
5332                           on l.id=r.id
5333            order by id,date;
ERROR: WHERE 子句运算符要求兼容的变量。
5334   quit;
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.01 秒

7
pobel 在职认证  发表于 2014-10-30 12:50:09
小鳄鱼a 发表于 2014-10-30 12:38
5322
5323
5324   proc sql;
如果pubdate是字符型变量,那就是 =“0”

8
playmore 发表于 2014-10-30 13:55:02
我这里给个傻瓜的方法,就是正着排一次求1,2,3...
然后再反着排一次求-1,-2,-3...
用了三个sort(如一开始有序,则只用了两次sort)加两个data步
都是顺序执行的,可能不比sql慢
  1. proc sort data=data;
  2.         by id date;
  3. run;

  4. data data;
  5.         set data;
  6.         by id;
  7.         retain w;
  8.         if first.id or pubdate=0 then w=pubdate;
  9.         else w=w+1;
  10. run;

  11. proc sort data=data;
  12.         by id DESCENDING date;
  13. run;

  14. data data;
  15.         set data;
  16.         by id;
  17.         retain w w_tmp;
  18.         if first.id and pubdate NE 0 then w_tmp=.;
  19.         else if pubdate=0 and w=0 then w_tmp=0;
  20.         else if w=. then w_tmp=w_tmp-1;
  21. run;

  22. data data(drop=w_tmp);
  23.         set data;
  24.         if w=. then w=w_tmp;
  25. run;

  26. proc sort data=data;
  27.         by id date;
  28. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 4 + 4 + 4 精彩帖子

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

9
小鳄鱼a 发表于 2014-10-30 21:25:17
pobel 发表于 2014-10-30 07:36
data wanted;
   merge test
         test(where=(_pubdate=0) rename=(date=_date pubdate=_pubdate) ...
能否解释下ifn  这个函数啊     谢谢  

10
小鳄鱼a 发表于 2014-10-30 21:26:29
pobel 发表于 2014-10-29 20:59
proc sql;
   create table wanted as
    select l.*,
select l.*,    什么意思啊

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

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