楼主: Actree
5724 10

怎样拿出一个观测和那个观测的上一个和下一个观测? [推广有奖]

  • 6关注
  • 2粉丝

讲师

30%

还不是VIP/贵宾

-

威望
0
论坛币
2704 个
通用积分
0
学术水平
9 点
热心指数
12 点
信用等级
8 点
经验
29471 点
帖子
272
精华
0
在线时间
485 小时
注册时间
2010-11-28
最后登录
2020-6-24

楼主
Actree 发表于 2011-5-19 15:17:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
想请教论坛朋友怎样拿出所有“haha” 观测和“haha”观测的上一个和下一个观测(备注:如果“haha" 出现在第一个或最后一个观测怎么办)? 比如:

obs    name
1        5
2        7
3        haha
4        0
5        
6        6
7        4
8        3
9        haha
...        ...
二维码

扫码加我 拉你入群

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

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

关键词:name 最后一个 obs 怎么办 观测

回帖推荐

guoluo 发表于4楼  查看完整内容

本帖被以下文库推荐

沙发
wb8686 发表于 2011-5-19 15:54:21
data _null_;
set a;
where name="haha";
call symput("obs",obs);
run;
%let obs1=%eval(&obs-1);
%let obs2=%=%eval(&obs+1);
data b;
set a;
where obs in(&obs1,&obs,&obs2);
run;

藤椅
Actree 发表于 2011-5-19 16:14:16
但是有几百个"haha" 2# wb8686

板凳
guoluo 发表于 2011-5-20 13:58:11
  1. data test;
  2.   input name $5.;
  3.   obs + 1;
  4. cards;
  5. haha
  6. haha
  7. haha
  8. 0

  9. 6
  10. haha
  11. 5
  12. 4
  13. 3
  14. haha
  15. ;

  16. proc sort data=test;
  17.   by obs;
  18. proc sort data=test out=test2;
  19.   by descending obs;
  20. run;

  21. data haha(keep=obs name);
  22.   set test(in=a) test2(in=b);
  23.   lag_name = lag(name);
  24.   if a then do;
  25.     if name = 'haha' or lag_name = 'haha' then output;
  26.   end;
  27.   if b then do;
  28.     if lag_name = 'haha' and name ^= 'haha' then output;
  29.   end;
  30. run;

  31. proc sort data=haha;
  32.   by obs;
  33. run;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
crackman + 1 鼓励积极发帖讨论
Actree + 1 + 1 + 1 不错

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

报纸
soporaeternus 发表于 2011-5-20 14:03:23
自连吧,obs_no +1或者-1等于 haha 的obs_no......
Let them be hard, but never unjust

地板
wb8686 发表于 2011-5-20 16:16:51
data a;
input obs    name$;
cards;
1        5
2        7
3        haha
4        0
5        
6        6
7        4
8        3
9        haha
10        1
11        23
12         23
13       haha
14        14
;
run;
proc  sql;
select count(*) into:nbr_haha from a
where name="haha";
select obs into:obs1-:obs%left(&nbr_haha) from a
where name="haha";
quit;
%put &nbr_haha &obs2;
%macro a;
data b;
%do i=1 %to &nbr_haha;
set a;
where obs in(%eval(&&obs&i-1),&&obs&i,%eval(&&obs&i+1));
output;
%end;
run;
%mend;
%a
proc sort data=b;
by obs;
run;
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
crackman + 1 鼓励积极发帖讨论
Actree + 1 + 1 + 1 不错

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

7
Actree 发表于 2011-5-22 12:56:40
Thanks guys!

8
ntsean 发表于 2011-5-22 13:38:29
这个一句就可以了

proc sql;
select a.*
from a as a, (select * from a where name='haha') as b
where (a.obs-b.obs) in (-1 0 1);
quit;

9
hopewell 发表于 2011-5-23 08:58:13
  1. data a;
  2.     infile datalines missover;
  3.     input obs name $;
  4. cards;
  5. 1 5
  6. 2 7
  7. 3 haha
  8. 4 0
  9. 5
  10. 6 6
  11. 7 4
  12. 8 3
  13. 9 haha
  14. 10 1
  15. 11 23
  16. 12 23
  17. 13 haha
  18. 14 14
  19. ;
  20. data b;
  21.     set a nobs=nobs;
  22.     if upcase(name)='HAHA' then
  23.         do i=max(_n_-1,1) to min(_n_+1,nobs);
  24.             set a point=i;
  25.             output;
  26.         end;
  27. run;
复制代码
已有 1 人评分热心指数 收起 理由
crackman + 1 鼓励积极发帖讨论

总评分: 热心指数 + 1   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

10
lihanfeng371 发表于 2011-5-25 13:57:48
8楼正解!!!

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

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