楼主: wdxmahone
9608 26

[原创博文] sas数据提取 [推广有奖]

21
soporaeternus2 发表于 2010-2-5 10:21:30
1个stkcd 1天有多个price?
我是把mark为1的纪录去和原数据叉乘,默认stkcd+date是键
如果有多个price的话数据肯定很大
原数据是什么样子的?

22
wdxmahone 发表于 2010-2-5 12:01:47
21# soporaeternus2
原数据量比较大,不过基本思想和前面的一样,就是数据集a里加了一个变量(profit),同样最后输出的变量多了price,profit变量,price主要是为了检验,关键profit有意义的,不能删减。。。我最近一直在想是不是只要将第一个观察值(observation)定了以后,后面的观察值就是提取前面的数据,再加入最后一个就可以做到了,这样做是不是能够缩减计算时间。。。

23
wdxmahone 发表于 2010-2-5 12:06:19
21# soporaeternus2
1个stkcd一天有多个price?原始数据是只有一个的, 这是最后的结果,而且我看不出结果的规律来,只是每一天多了6个观测值,正好就是(a)的数量。。

24
frackdeng 发表于 2010-2-5 15:57:07
13# wdxmahone
测试一下
data a;
  input stkcd $ date $10. price mark;
  cards;
00 2009-01-02 12.01 0
00 2009-01-03 12.03 1
00 2009-01-06 12.00 1
00 2009-01-07 11.56 0
00 2009-01-08 11.87 0
01 2009-01-02 10.01 0
01 2009-01-03 10.03 1
01 2009-01-06 10.00 0
01 2009-01-07 10.56 1
01 2009-01-08 10.87 0
;
run;
proc sort data=a out=b;
   by stkcd decending date;
run;
%macro _lag(n=4);
    %do i=1 %to &n;
     lag_a_&i=lag&i(price);
     if lag&i(stkcd)=stkcd then a_&i=lag_a_&i;
%end;
%mend _lag;
data c1;
   set a;
   %_lag(n=2);
   a0=price;
   if mark=1;
run;
data c2;
   set b;
   %_lag(n=2);
   if mark=1;
run;
%macro _num(n=4);
    %do i=&n %to 1 %by -1;
    c1.a_&i,
%end;
%mend _num;
%macro num(n=4);
    %do i=1 %to &n;
    c2.a_&i as a&i,
%end;
%mend num;
proc sql;
    create table c as
select c1.stkcd,c1.date,
           %_num(n=2)
           c1.a0,
           %num(n=2)
           c1.mark
from c1 left join c2
on c1.stkcd=c2.stkcd and c1.date=c2.date;
quit;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
wdxmahone + 1 + 1 + 1 非常棒!

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

25
wdxmahone 发表于 2010-2-26 12:12:49
24# frackdeng
谢谢啊,这种方法非常好,而且很快!!!

匿名网友
26
匿名网友  发表于 2011-8-20 23:24:51
data a;
input stkcd $ date yymmdd10.  price mark;
format date yymmdd10.;
cards;
00 2009-01-02 12.01 0
00 2009-01-03 12.03 0
00 2009-01-06 12.00 1
00 2009-01-07 11.56 0
00 2009-01-08 11.87 0
01 2009-01-02 10.01 0
01 2009-01-03 10.03 0
01 2009-01-06 10.00 0
01 2009-01-07 10.56 1
01 2009-01-08 10.87 0
;
run;
data aa(drop=price);
set a;
if mark ne 1 then delete;
else do;
  do _n_=_n_-1 to _n_+1;
  set a(keep=price rename=(price=pricee)) point=_n_;
  output;
  end;
end;
run;
data result(drop=pricee);
do _n_=1 by 1 until(last.stkcd);
set aa;
by stkcd;
array arr(*) a_1 a0 a1;
arr(_n_)=pricee;
end;
run;

27
shenliang_111 发表于 2011-8-20 23:39:22
如果是多个MARK的情形,可以这样做:
data s;
  input stkcd $ date $10. price mark;
  cards;
00 2009-01-02 12.01 0
00 2009-01-03 12.03 1
00 2009-01-06 12.00 1
00 2009-01-07 11.56 0
00 2009-01-08 11.87 0
01 2009-01-02 10.01 0
01 2009-01-03 10.03 1
01 2009-01-06 10.00 0
01 2009-01-07 10.56 1
01 2009-01-08 10.87 0
;
run;
data aaa(drop=price);
set s;
if mark ne 1 then delete;
else do;
  do i=_n_-1 to _n_+1;
  set a(keep=price rename=(price=pricee)) point=i;
  output;
  end;
end;
run;
data result2(drop=pricee);
do _n_=1 by 1 until(last.date);
set aaa;
by stkcd date ;
array arr(*) a_1 a0 a1;
arr(_n_)=pricee;
end;
run;

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

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