楼主: pokemonpika
1392 7

求助 如何筛选出数据 在线等 [推广有奖]

  • 0关注
  • 0粉丝

学前班

60%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
76 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2013-6-14
最后登录
2016-4-18

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

求助想要筛选出连续三年以上有出现的ID2010201120122013或是201020112012201120122013,都有出现的则是要保留的个案,中间有中断的编号6则不符合,

  

ID

  

year

Money

1

2010

200

1

2011

550

1

2012

350

2

2010

200

2

2011

430

2

2012

570

2

2013

550

3

2010

450

3

2013

235

4

2012

550

5

2010

570

5

2011

350

5

2012

220

5

2013

750

6

2010

150

6

2012

350

6

2013

540

7

2010

355

7

2011

465

7

2012

460

8

2013

500

目前想到的方法是先将年份挑出来并且给予编码例如

  

ID

  

N_year

1

1110

2

1111

3

1001

4

0010

5

0111

6

1011

7

1110

8

0001

然后再筛选出N_year中有出现 "111"三个连续1的个案保留,保留1257符合的个案,最后提取出最后表格成为

  

ID

  

year

Money

1

2010

200

1

2011

550

1

2012

350

2

2010

200

2

2011

430

2

2012

570

2

2013

550

5

2010

570

5

2011

350

5

2012

220

5

2013

750

7

2010

355

7

2011

465

7

2012

460

拜托各位大神语法该怎么写? 感谢


二维码

扫码加我 拉你入群

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

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

关键词:筛选出 在线等 money year ear 在线 如何 2011

沙发
孤单的我们 发表于 2016-4-18 10:09:41 |只看作者 |坛友微信交流群
  1. data text1;
  2. input ID year Money ;
  3. cards;
  4. 1 2010 200
  5. 1 2011 550
  6. 1 2012 350
  7. 2 2010 200
  8. 2 2011 430
  9. 2 2012 570
  10. 2 2013 550
  11. 3 2010 450
  12. 3 2013 235
  13. 4 2012 550
  14. 5 2010 570
  15. 5 2011 350
  16. 5 2012 220
  17. 5 2013 750
  18. 6 2010 150
  19. 6 2012 350
  20. 6 2013 540
  21. 7 2010 355
  22. 7 2011 465
  23. 7 2012 460
  24. 8 2013 500
  25. ;
  26. run;

  27. data text2;
  28.         set text1;
  29.         by id;
  30.         if first.id then new_id=year;
  31.                 else new_id+1;
  32.         if new_id=year then aa=1;
  33. run;

  34. proc sql;
  35.         create table want as
  36.         select id,year,Money from text2 group by id having sum(aa)>=3;
  37. quit;
复制代码

使用道具

藤椅
孤单的我们 发表于 2016-4-18 11:03:53 |只看作者 |坛友微信交流群
另一种解法
  1. proc sql noprint ;
  2.         create table want as
  3.         select * from text1 group by id having count(id)>=3 & max(year)-min(year)+1=count(id);
  4. quit;
复制代码

使用道具

板凳
casper2 发表于 2016-4-18 11:14:40 来自手机 |只看作者 |坛友微信交流群
建议,先把数据排序,然后新建一个变量y2,把y2赋值为各ID的第一个值,然后下一个obs y2增1。再做比较year vs. y2,相同者赋值1给新变量flag,否则flag为零。再做一个proc univariate,对flag求和,大于等于3者保留。

使用道具

报纸
casper2 发表于 2016-4-18 11:27:40 来自手机 |只看作者 |坛友微信交流群
如果不用 proc univariate,用 .first,.last 也成。

使用道具

地板
孤单的我们 发表于 2016-4-18 13:10:37 |只看作者 |坛友微信交流群
casper2 发表于 2016-4-18 11:14
建议,先把数据排序,然后新建一个变量y2,把y2赋值为各ID的第一个值,然后下一个obs y2增1。再做比较year  ...
tiger,你和我的第一种思路想到一块去了

使用道具

7
guanglei 发表于 2016-4-18 18:48:59 |只看作者 |坛友微信交流群
data text1;
input ID year Money ;
cards;
1 2010 200
1 2011 550
1 2012 350
2 2010 200
2 2011 430
2 2012 570
2 2013 550
3 2010 450
3 2013 235
4 2012 550
5 2010 570
5 2011 350
5 2012 220
5 2013 750
6 2010 150
6 2012 350
6 2013 540
7 2010 355
7 2011 465
7 2012 460
8 2013 500
;
run;

proc sort data = text1;
by id year;
run;

data want(keep=id);
        set text1;
        by id;
        retain lyear;
        if first.id then do;
                lyear = year;count = 1;end;
                else do;
                        if year = lyear + 1 then do; lyear = year;count+1;end;
        end ;
        if last.id and count>=3 then output;
run;

使用道具

8
eflucy 发表于 2016-4-19 13:43:57 |只看作者 |坛友微信交流群
如果没有2011或2012 年那就绝对不是了

使用道具

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

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

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

GMT+8, 2024-5-2 19:14