SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 754|回复: 4
打印 上一主题 下一主题

如何实现这种lag

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-6-24 14:08:57 | 只看该作者

如何实现这种lag

有以下数据:

ret             date
0.001       20040307
0.014       20040308
.              20040309
.              20040312
.              20040509
0.013       20040511
0.008       20040601



. 代表缺失值,对于ret缺失的观测,我想让该行的date等于离它最近的一个日期,比如,让第三行的20040309变为第二行的20040308,第四行的20040312也变为第二行的20040308;而第五行的20040509,我则想让它等于第六行的20030511。这里给出的只是局部的数据,原来的数据集在很多地方都出现这种情况,
所以不能一个一个地赋值。请问各位高手该怎么处理呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-6-24 16:21:56 | 只看该作者

Re: 如何实现这种lag

不清楚规则,第四行为什么要等于第二行,它离第二行和第六行一样近
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-6-24 17:56:36 | 只看该作者

Re: 如何实现这种lag

[code:2qdascri]data raw;
    input ret date:yymmdd8.;
    rowid=_n_;
    format date yymmdd10.;
datalines;
0.001 20040307
0.014 20040308
. 20040309
. 20040312
. 20040509
0.013 20040511
0.008 20040601
;
data out(keep=rowid ret date);
    if _n_=1 then do;
        declare hash h(hashexp:8);
        rc=h.defineKey('id');
        rc=h.defineData('lrowid','trowid','lret','tret');
        rc=h.defineDone();
        call missing(id,lrowid,trowid,lret,tret);
        declare hiter iter('h');
    end;
    set raw(where=(not missing(ret)) in=hash) raw;
    if hash then do;
        if _n_ gt 1 then h.add(key:_n_,data:lag(rowid),data:rowid,data:lag(ret),data:ret);
    end;
    else do;
        rc=iter.first();
        if missing(ret) then
            do until(iter.next() ne 0);
                if lrowid<rowid<trowid then do;
                    ret=ifn(rowid-lrowid le trowid-rowid,lret,tret);
                    leave;
                end;
            end;
        output;
    end;
run;[/code:2qdascri]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-6-25 09:21:57 | 只看该作者

Re: 如何实现这种lag

hopewell  大侠, 您用的code好像是实现了rate缺失使用相邻的rate,没有实现楼主的date的处理!
  另外, 您的处理方式是用的SCL语言吧? 一般人都不太懂,不知道有没有别的处理方式?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-6-25 09:43:27 | 只看该作者

Re: 如何实现这种lag

does this work?
[code:2qis8do4]
data raw;
    input ret date:yymmdd8.;
    rowid=_n_;
    format date yymmdd10.;
datalines;
0.001 20040307
0.014 20040308
. 20040309
. 20040312
. 20040509
0.013 20040511
0.008 20040601
;
run;

proc sort data=raw; by date; run;

data new;
        set raw;
                retain miss  lastval 0;
                if ret=. then do;
           miss=1;  ret1=lastval;
                end;
                else do;
           miss=0; ret1=ret;
                end;
                if miss=0 then lastval=ret;
run;
[/code:2qis8do4]
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 03:34 , Processed in 0.068467 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表