楼主: liu022
2176 8

[原创博文] 请教某条记录前后N条记录的程序 [推广有奖]

  • 0关注
  • 6粉丝

讲师

63%

还不是VIP/贵宾

-

威望
0
论坛币
932 个
通用积分
8.7513
学术水平
23 点
热心指数
18 点
信用等级
21 点
经验
3670 点
帖子
431
精华
1
在线时间
370 小时
注册时间
2007-5-21
最后登录
2023-1-2

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
大家好!

小弟昨天在论坛上发了一个选样的帖子。目前还没有得到有效的答案。请大家再帮忙看看。谢谢

问题如下:
var1   var2
1
2
3        0
4        
5
6
7        0
8
9
10

选出var2为0位置前后两个观测值。不用两个Data步来实现,怎么弄?
我希望看到有效率的做法。毕竟可能选出30或者更多个观测,不建议用
proc expand data=....
convert var2=x/transform(lag 1)
convert var2=x/transform(lead 1)
run;
因为很多个,不可能一个一个的写~谢谢!
二维码

扫码加我 拉你入群

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

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

关键词:transform Convert expand Trans data步 convert 程序 记录

沙发
liu022 发表于 2011-12-16 21:04:45 |只看作者 |坛友微信交流群
自己顶下~

使用道具

藤椅
275769263 发表于 2011-12-16 23:58:42 |只看作者 |坛友微信交流群
这个合适么?
data a;
input var1 var2;
cards;
1 .
2 .
3 0
4 .
5 .
6 .
7 0
8 .
9 .
10 .
;
run;

data b;
        set a;
        if var2=0 then do;
                need=_n_;
                do i=need-1 to need+1;
                set a point=i;
                output;
                end;
        end;
run;
求工作..求工作..求工作..求工作...

使用道具

板凳
lltas7 发表于 2011-12-17 00:30:24 |只看作者 |坛友微信交流群
hi, 我也有个办法。

data temp1; set a;
retain calln 0;
calln+1;
run;

data temp2; set a;
where var2=0;

proc sql;
create table final
as select a.*, b.var1 as var1_picked
from temp2 as a left join temp1 as b
on a.calln+1=b.calln or a.calln-1=b.calln;
quit;

使用道具

报纸
liu022 发表于 2011-12-17 20:05:55 |只看作者 |坛友微信交流群
275769263 发表于 2011-12-16 23:58
这个合适么?
data a;
input var1 var2;
对,这个太牛了~非常感谢!我得多向您学习才是啊~

使用道具

地板
liu022 发表于 2011-12-17 20:08:34 |只看作者 |坛友微信交流群
lltas7 发表于 2011-12-17 00:30
hi, 我也有个办法。

data temp1; set a;
谢谢您的回复,貌似这个段程序有问题:日志如下:

34   proc sql;
35   create table final
36   as select a.*, b.var1 as var1_picked
37   from temp2 as a left join temp1 as b
38   on a.calln+1=b.calln or a.calln-1=b.calln;
ERROR: 列 calln 在表/视图中未找到,其相关名为 A.
ERROR: 列 calln 在表/视图中未找到,其相关名为 A.
ERROR: 列 calln 在表/视图中未找到,其相关名为 A.
ERROR: 列 calln 在表/视图中未找到,其相关名为 A.
39   quit;
NOTE: SAS 系统由于错误而停止了该步的处理。
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
      实际时间          0.13 秒
      CPU 时间          0.01 秒

上面的老师的做法是我心仪的做法。谢谢您的指导!

使用道具

7
lltas7 发表于 2011-12-17 21:02:28 |只看作者 |坛友微信交流群
liu022 发表于 2011-12-17 20:08
谢谢您的回复,貌似这个段程序有问题:日志如下:

34   proc sql;
确实有个地方写错了。我很水的。

data a;
input var1 var2;
cards;
1 .
2 .
3 0
4 .
5 .
6 .
7 0
8 .
9 .
10 .
;
run;

data temp1; set a;
retain calln 0;
calln+1;
run;

data temp2; set temp1;
where var2=0;

proc sql;
create table final
as select a.*, b.var1 as var1_picked
from temp2 as a left join temp1 as b
on a.calln+1=b.calln or a.calln-1=b.calln;
quit;

使用道具

8
275769263 发表于 2011-12-17 21:59:32 |只看作者 |坛友微信交流群
liu022 发表于 2011-12-17 20:05
对,这个太牛了~非常感谢!我得多向您学习才是啊~
也是学别人的,哈哈。
求工作..求工作..求工作..求工作...

使用道具

9
liu022 发表于 2011-12-21 18:02:17 |只看作者 |坛友微信交流群
lltas7 发表于 2011-12-17 21:02
确实有个地方写错了。我很水的。

data a;
您客气了~您的SQL语句用得好熟练哦~谢谢指导!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 12:35