楼主: godawgs188
2224 8

[原创博文] 【请教】SAS 提取数据对 [推广有奖]

  • 0关注
  • 0粉丝

大专生

48%

还不是VIP/贵宾

-

威望
0
论坛币
30 个
通用积分
1.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
516 点
帖子
56
精华
0
在线时间
46 小时
注册时间
2009-11-8
最后登录
2021-11-20

楼主
godawgs188 发表于 2010-2-7 00:35:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
data a;
input id mark sales;
cards;
111   1   999999
222   0   888888
333   0   777777444   1   666666
555   1   555555
666   0   444444
777   0   333333
888   0   222222
999   0   111111
;
run;


数据a已经根据sales由大到小排列好,现在我想把mark=1的观察值和离它最近的下一个mark=0的观察值提取出来,结果就是


id    mark sales
111   1   999999
222   0   888888
444   1   666666
555   1   555555
666   0   444444
777   0   333333


希望能用macro写出来,谢谢呵。。。。。。。


二维码

扫码加我 拉你入群

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

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

关键词:sales Macro Input cards Mark

回帖推荐

frackdeng 发表于9楼  查看完整内容

data b; set a; mark1=lag(mark); if mark=1 and mark1^=1 then n=1; else if mark=1 and mark1=1 then n+1; else n+(-1); if n>=0; drop mark1 n; run; 8# godawgs188

funnyxuke 发表于3楼  查看完整内容

data a; input id mark sales; cards; 111 1 999999 222 0 888888 333 0 777777 444 1 666666 555 1 555555 666 0 444444 777 0 333333 888 0 222222 999 0 111111 ; run; data b; set a; if mark=1 or lag(mark)=1 then output; run; proc print data=b; run; 1# godawgs188

本帖被以下文库推荐

沙发
bobguy 发表于 2010-2-7 04:12:47
godawgs188 发表于 2010-2-7 00:35
data a;
input id mark sales;
cards;
111   1   999999
222   0   888888
333   0   777777444   1   666666
555   1   555555
666   0   444444
777   0   333333
888   0   222222
999   0   111111
;
run;


数据a已经根据sales由大到小排列好,现在我想把mark=1的观察值和离它最近的下一个mark=0的观察值提取出来,结果就是


id    mark sales
111   1   999999
222   0   888888
444   1   666666
555   1   555555
666   0   444444
777   0   333333


希望能用macro写出来,谢谢呵。。。。。。。


According to your rule the record

777   0   333333

Should not be there.

藤椅
funnyxuke 发表于 2010-2-7 04:31:22
data a;
input id mark sales;
cards;
111   1   999999
222   0   888888
333   0   777777
444   1   666666
555   1   555555
666   0   444444
777   0   333333
888   0   222222
999   0   111111
;
run;

data b;
set a;
if mark=1 or lag(mark)=1 then output;
run;

proc print data=b;
run;


1# godawgs188
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

板凳
godawgs188 发表于 2010-2-7 04:39:24
离111(mark=1) 最近的下一个mark=0 的观察值是222(mark=0)
同理,
离444(mark=0) 最近的下一个mark=0 的观察值是666(mark=0)
离555(mark=0) 最近的下一个mark=0 的观察值是777(mark=0)
所以,在RESULT里,mark=0 的观察值数应该等于mark=0 的观察值数。

报纸
godawgs188 发表于 2010-2-7 04:39:58
离111(mark=1) 最近的下一个mark=0 的观察值是222(mark=0)
同理,
离444(mark=0) 最近的下一个mark=0 的观察值是666(mark=0)
离555(mark=0) 最近的下一个mark=0 的观察值是777(mark=0)
所以,在RESULT里,mark=0 的观察值数应该等于mark=0 的观察值数。

地板
godawgs188 发表于 2010-2-7 05:07:02
funnyxuke 发表于 2010-2-7 04:31

data b;
set a;
if mark=1 or lag(mark)=1 then output;
run;

proc print data=b;
run;
好像还是不对。

7
funnyxuke 发表于 2010-2-7 12:37:59
离555(mark=0) 最近的下一个mark=0 的观察值是777(mark=0)?
不懂
6# godawgs188

8
godawgs188 发表于 2010-2-7 17:47:58
funnyxuke 发表于 2010-2-7 12:37
离555(mark=0) 最近的下一个mark=0 的观察值是777(mark=0)?
不懂
6# godawgs188
111   1   999999
222   0   888888
333   0   777777
444   1   666666
555   1   555555
666   0   444444
777   0   333333
888   0   222222
999   0   111111


也许我没有说明白,
每一个MARK=1的观察值,都要找到排列在后的对应的一个MARK=0的观察值,
111 (MARK=1)对应的是222(MARK=0)(排列在后的,离111最近,所以333不是)
444 (MARK=1)对应的是666(MARK=0)
555 (MARK=1)对应的是777(MARK=0)
因此,333, 888,999 都舍掉了。

9
frackdeng 发表于 2010-2-8 14:26:37
data b;
   set a;
   mark1=lag(mark);
   if mark=1 and mark1^=1 then n=1;
   else if mark=1 and mark1=1 then n+1;      
   else n+(-1);
   if n>=0;
   drop mark1 n;
run;

8# godawgs188
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 02:01