全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
9438 26
2010-01-28
data a;
input stkcd $ date $ price mark;
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;

现在我想变成这样
stkcd            date        mark     a_1       a0        a1
  00         2009-01-06    1       12.03   12.00    11.56
  01         2009-01-07    1       10.00   10.56    10.87

就是将标记为1的观察值的前一个和后一个观察值的价格变量提取出来,写成上面的形式,重新定义新的变量。由于我要处理数据比较多,希望尽可能的用程序写出来,包括要提取的观察值也有几十个。
希望能够得到很好的解决,谢谢哈。。。。



我现在还有这种形式的数据:
data b;
input date& r00 r01;
cards;
2009-01-02 12.01 11.01
2009-01-03 12.03 11.03
2009-01-06 12.00 10.00
2009-01-07 11.56 10.56
2009-01-08 11.87 10.87

;
data d;
input stkcd $ date $ price;
cards;
r00 2009-01-06 12.00
r01 2009-01-07 10.56
;

run;

渴望能够得到正解。。。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-1-28 11:09:43
data a;
input stkcd $ date $10. price mark;
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 b;
        set a;
        num+1;
run;

proc sql;
        create table d1 as
                select stkcd,price as a_1 from b
                        where b.num in (select num-1 from b where b.mark = 1);
        create table d2 as
                select stkcd,date,price as a0,mark,num from b
                        where b.num in (select num from b where b.mark = 1);
        create table d3 as
                select stkcd,price as a1 from b
                        where b.num in (select num+1 from b where b.mark = 1);
        create table e as
                select d2.stkcd, d2.date, d2.mark, d1.a_1, d2.a0, d3.a1
                        from d1, d2, d3
                 where d1.stkcd = d2.stkcd and d2.stkcd = d3.stkcd;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-28 11:35:45
复制代码

粗粗测试了下,没有问题,通过设定before和after的值可以设置mark=1之前和之后的任意条记录,没有则为0
DATA步也可以做,代码有点难看,就用SQL啦......
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-28 11:36:08
2# zcxdxq

很好,但是可能我的数据更复杂,每只股票多几个1就会出错(比如下面),不过这个应该可以处理,多提取几个变量匹配就行了。还有因为我可能要提取前后各五六十行,所以可能出现a_50, a50这些变量,可不可以通过循环来解决啊!

非常感谢。

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;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-28 11:44:12
LZ看我的3楼,可能可以满足你
但是一个stkcd 2个 mark=1 还不行
容我有时间修改下......
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-1-28 11:55:09
3# soporaeternus2

不大能够看懂,我现在是边学习边使用,macro那一块内容,还没怎么看呢!还有,好像您习惯在程序编辑器里编辑,我一般在增强程序编辑器中编辑,您的那些代码,复制我的程序编辑器里不工作,而且我现在可能也没有能力去将您的程序修改用于我的工作,因为这一块我不太懂啊,最近在加紧学习呢!

不过还是谢谢了,二楼的sql语言还是比较通俗易懂的,现在主要是针对他提供的程序作修改了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群