楼主: liuliuqiu
984 6

[问答] SAS求教 [推广有奖]

  • 6关注
  • 2粉丝

副教授

62%

还不是VIP/贵宾

-

威望
0
论坛币
2340 个
通用积分
8.9561
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1113 小时
注册时间
2009-3-24
最后登录
2024-2-29

5论坛币
求教:现有数据
id         year       entry  
1          2002        0
1          2003        1
1          2004        0
1          2005        0
1          2006        1
1          2007        0
1          2008        0
1          2009        0
如以上原始数据,每个个体Id 对应着不同的时间和entry值,entry的取值可能为0或1(先出现0后出现1)。
想进行数据筛选。删去entry取0,但后面没有1的那些观测值。以上数据的结果为:
id         year       entry  
1          2002        0
1          2003        1
1          2004        0
1          2005        0
1          2006        1


最佳答案

lyfyb99 查看完整内容

data test; input id year entry ; cards; 1 2002 0 1 2003 1 1 2004 0 1 2005 0 1 2006 1 1 2007 0 1 2008 0 1 2009 0 2 2002 0 2 2003 1 2 2004 0 2 2005 0 2 2006 1 2 ...
关键词:ENTRY year 数据筛选 原始数据 Try
沙发
lyfyb99 在职认证  发表于 2016-4-26 10:00:46 |只看作者 |坛友微信交流群

data test;
input id   year     entry  ;
cards;
1          2002        0
1          2003        1
1          2004        0
1          2005        0
1          2006        1
1          2007        0
1          2008        0
1          2009        0
2          2002        0
2          2003        1
2          2004        0
2          2005        0
2          2006        1
2          2007        0
2          2008        1
2          2009        0
;
run;

proc sort data=test; by id descending year; run;

data test01;
set test;
by id descending year;
retain flag;
if first.id then flag=.;
if entry=1 then flag=1;
run;

proc sort data=test01 out=test02; by id year; where flag=1; run;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 热心帮助其他会员
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

藤椅
liuliuqiu 发表于 2016-4-26 10:48:00 |只看作者 |坛友微信交流群
求帮助

使用道具

板凳
yzhch2010bsh 发表于 2016-4-26 10:48:46 |只看作者 |坛友微信交流群
2004那条观测应该也没有吧。我觉得可以用lag函数,lag值小于当前值的条件不就是你想要的数据吗
已有 1 人评分论坛币 收起 理由
admin_kefu + 5 热心帮助其他会员

总评分: 论坛币 + 5   查看全部评分

使用道具

报纸
liuliuqiu 发表于 2016-4-26 12:26:27 |只看作者 |坛友微信交流群
yzhch2010bsh 发表于 2016-4-26 10:48
2004那条观测应该也没有吧。我觉得可以用lag函数,lag值小于当前值的条件不就是你想要的数据吗
2004那条观测值是有的。只要后面有1,就保留前面的所有0.所以,不能用lag呢

使用道具

地板
5傻小不点 发表于 2016-4-26 13:16:58 |只看作者 |坛友微信交流群
初学者,供参考:
proc sql;
        select sum(entry) into :max
        from a;
quit;
data b;
        set a;
        retain x;
        x+entry;
        if x=&max and entry=0 then delete;
        drop x;
run;
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 热心帮助其他会员
admin_kefu + 10 热心帮助其他会员

总评分: 论坛币 + 10  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

7
孤单的我们 发表于 2016-4-26 13:17:53 |只看作者 |坛友微信交流群
  1. data a;
  2. input id year entry ;
  3. cards;
  4. 1 2002 0
  5. 1 2003 0
  6. 1 2004 1
  7. 1 2005 0
  8. 1 2006 1
  9. 1 2007 0
  10. 1 2008 1
  11. 1 2009 1
  12. ;
  13. run;

  14. data b;
  15.         set a;
  16.         by id;
  17.         retain sum;
  18.         sum+entry;
  19. run;

  20. data c;
  21.         set b;
  22.         by id sum;
  23.         if first.sum & (^first.id) then sum=sum-1;
  24. run;

  25. proc sql;
  26.         select id,year,entry from c group by sum having sum(entry)=1 & count(*)>1 order by id,year;
  27. quit;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 热心帮助其他会员
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

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

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

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

GMT+8, 2024-4-27 19:23