楼主: tytyxiada
4265 15

[原创博文] 求助:SAS数据处理 [推广有奖]

11
ntsean 发表于 2011-2-28 13:48:39
这个行吗?, 2组数据(升和降,分别存在increase和decrease)
data a;
input stkcd $ year money;
cards;
000001 2001 0
000001 2002 0
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 0
000005 2004 0
000005 2005 0
000005 2006 0
;
run;

proc expand data=a out=b method=none;
by stkcd;
convert money=money_lead /transformout=(lead 1);
convert money=money_lag /transformout=(lag 1);
run;

data increase decrease;
set b;
if money-money_lead=-1 or money-money_lag=1 then output increase;
if money-money_lead=1 or money-money_lag=-1 then output decrease;
drop time money_lead money_lag;

proc print data=decrease;run;
proc print data=increase;run;
tytyxiada 发表于 2011-2-28 11:44
8# ntsean
请教高手:
程序的运行结果,只是输出了变化后的那个观测,而没有实现:输出的是有变化的两个观测,也就是前后年的都要输出。
请大侠再帮我看看,谢谢!

12
275769263 发表于 2011-2-28 15:42:16
10# tytyxiada
不客气...但是我发现一个小问题...可能是lag函数的原因..但是我想不明白...希望大侠们指点指点...
如果我使用下面这段代码..为什么2002年的dif是-1。
data a;
input stkcd year money;
if stkcd=lag(stkcd) then dif=dif(money);
cards;
000001 2001 0
000001 2002 1
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 0
000005 2004 0
000005 2005 0
000005 2006 0
;
run;

未命名.jpg (23.36 KB)

未命名.jpg

13
275769263 发表于 2011-2-28 15:48:50
11# ntsean
这个好..

14
ntsean 发表于 2011-2-28 22:08:54
一般来说lag不要和if 用在一个语句,会有问题
你的代码可以用 last, first改写。
275769263 发表于 2011-2-28 15:42
10# tytyxiada
不客气...但是我发现一个小问题...可能是lag函数的原因..但是我想不明白...希望大侠们指点指点...
如果我使用下面这段代码..为什么2002年的dif是-1。
data a;
input stkcd year money;
if stkcd=lag(stkcd) then dif=dif(money);
cards;
000001 2001 0
000001 2002 1
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 0
000005 2004 0
000005 2005 0
000005 2006 0
;
run;

15
tytyxiada 在职认证  发表于 2011-2-28 22:46:48
11# ntsean
感谢各路高手!!

16
shenliang_111 发表于 2011-8-23 15:54:12
data a;
input stkcd year money;
cards;
000001 2001 0
000001 2002 0
000001 2003 0
000001 2004 0
000001 2005 1
000001 2006 1
000001 2007 0
000001 2008 0
000001 2009 1
000005 2001 0
000005 2002 0
000005 2003 1
000005 2004 1
000005 2005 0
000005 2006 0
;
run;
proc expand data=a  out=aa(drop=time) method=none;
by stkcd;
convert money=_money1/transformout=(lead 1);
run;
data aaa;
do _n_=1 by 1 until(last.stkcd);
set aa;
by stkcd;
if  money=0 and _money1=1 then flag=1;
   else if money=1 and _money1=0 then flag=2;
        else flag=0;
output;
end;
run;
data aann aamm;
set aaa;
if flag=0 then delete;
    else if flag=1  then do;
     do i=_n_ to _n_+1;
  set aaa(keep=year money) point=i;
  output aann;
  end;
  end;
        else if flag=2 then do;
  do i=_n_ to _n_+1;
  set aaa(keep=year money) point=i;
  output aamm;
  end;
  end;
run;

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

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