楼主: wildpanda
7774 10

求助,怎么在IF语句里使用Do循环 [推广有奖]

  • 1关注
  • 0粉丝

已卖:1份资源

大专生

95%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
135 点
帖子
16
精华
0
在线时间
123 小时
注册时间
2012-9-29
最后登录
2014-4-17

楼主
wildpanda 发表于 2014-1-25 22:12:33 |AI写论文
5论坛币
大概是这样,我想往缺少的时间戳里填补数据。(比如说9:00:019:00:05         如果没有数据,那么我就将9:00:00的数据复制给9:00:019:00:05,当然我是在9:00:06才能发现9:00:019:00:05没有数据的)。

但是发现无法用IF语句来使用循环。(if then do ……do i=1 to tickgap  …. End 这样好像无法运行)

data a;

    set timelist;

    timegap=intck('second',lag(time),time); /* 检查是否丢失*/

    if timegap>1 then do   /*填补丢失时间*/

    do i=1to tickgap;

    temptime=time;

    tempvalue=value;

   time=time+'0:00:01't;/*循环复制上一个时间的数据到当前行*/

    value=lag(value);

    output;

   time=temptime;/*将最新行恢复为当前时间数据*/

   value=    tempvalue

    end;

    end;


关键词:do循环 pvalue output Second value second

本帖被以下文库推荐

沙发
wildpanda 发表于 2014-1-25 22:13:52

数据格式:
9:00:00 1
9:00:06 6
9:00:07 7
9:00:08 8


希望生成的结果
9:00:00 1
9:00:01 1
9:00:02 1
9:00:03 1
9:00:04 1
9:00:05 1
9:00:06 6
9:00:07 7
9:00:08 8



藤椅
pobel 在职认证  发表于 2014-1-26 09:26:47
data timelist;
   input time : time8. n;
   format time time8.;
   cards;
9:00:00 1
9:00:06 6
9:00:07 7
9:00:08 8
;

data a;
    set timelist nobs=nobs;
        if _N_<nobs then do;
        set timelist(firstobs=2 rename=(time=time1 n=n1));
                output;
        do while(time<time1-1);
                   time+1;output;
                end;
        end;
        else output;
        drop time1 n1;
run;
          
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 谢谢,很有得。

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

和谐拯救危机

板凳
dengrong1989 发表于 2014-1-26 10:55:25
pobel 发表于 2014-1-26 09:26
data timelist;
   input time : time8. n;
   format time time8.;
大神啊  学习了

报纸
yongyitian 发表于 2014-1-26 13:03:54
  1. data timelist;
  2. input time time. value;
  3. format time time.;
  4. datalines;
  5. 9:00:00 1
  6. 9:00:06 6
  7. 9:00:07 7
  8. 9:00:08 8
  9. 9:00:10 10
  10. ; run;

  11. /* using hash table */
  12. data _null_;
  13.    if 0 then set timelist;
  14.    declare hash h(dataset: 'timelist', ordered: 'a');
  15.    declare hiter hi('h');
  16.    h.definekey('time');
  17.    h.definedata('time', 'value');
  18.    h.definedone();
  19.            hi.last();   maxtime = time;
  20.       rc = hi.first();  mintime = time;
  21.    do while(rc=0);
  22.        do time = mintime to maxtime;
  23.           if h.find() then  h.add();
  24.        end;
  25.        rc=hi.next();
  26.    end;
  27.      rc=h.output(dataset: 'bbb');      
  28. run;

  29. /* data step */
  30. data a;
  31.     set timelist;
  32.     time_lag = lag(time);
  33.    value_lag = lag(value);
  34.     if  time - time_lag > 1 then do;   
  35.        tempvalue = value;
  36.            value = value_lag;
  37.          do time = time_lag +1 to time-1;
  38.             output;
  39.          end;  
  40.            value = tempvalue; output;
  41.      end;
  42.      else output;
  43.     keep time value;;
  44. run;
复制代码

地板
wildpanda 发表于 2014-1-27 10:50:48
pobel 发表于 2014-1-26 09:26
data timelist;
   input time : time8. n;
   format time time8.;
多谢大神!  
set timelist nobs=nobs; 这句怎么理解

7
wildpanda 发表于 2014-1-27 11:30:29
yongyitian 发表于 2014-1-26 13:03
加入哈希表的作用是做什么呢,BBB木有看懂。。。。

8
pobel 在职认证  发表于 2014-1-27 11:31:23
wildpanda 发表于 2014-1-27 10:50
多谢大神!  
set timelist nobs=nobs; 这句怎么理解
请查看帮助里的SET语句 nobs=选项
和谐拯救危机

9
yongyitian 发表于 2014-1-27 11:54:11
wildpanda 发表于 2014-1-27 11:30
加入哈希表的作用是做什么呢,BBB木有看懂。。。。
先把数据集timelist按变量time的升序排列放入hash表中,然后从最小的time到最大的time值循环查找, 把缺失的添加到表中。最后将hash表的数据输出到数据集bbb。

下面的数据步和你的code差不多。

10
wildpanda 发表于 2014-1-27 14:00:55
yongyitian 发表于 2014-1-27 11:54
先把数据集timelist按变量time的升序排列放入hash表中,然后从最小的time到最大的time值循环查找, 把缺失 ...
多谢  BBB只出现在HASH步,后面不需要引用BBB吗

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

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