楼主: liuliuqiu
1669 13

[问答] SAS程序 [推广有奖]

  • 6关注
  • 2粉丝

已卖:35份资源

副教授

64%

还不是VIP/贵宾

-

威望
0
论坛币
2239 个
通用积分
8.1161
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1129 小时
注册时间
2009-3-24
最后登录
2025-12-11

楼主
liuliuqiu 发表于 2016-4-19 10:09:34 |AI写论文
5论坛币
请教各位:
id        t                v
1        2000         1
1        2001         2
1        2002         0
1        2003         0
1        2004         3
1        2005         4
1        2006         0
1        2007         5
1        2008         6
1        2009         7
1        2010         8
2        2000         9
2        2001         10
2        2002         11
2        2003         12
2        2004         0
2        2005         0
2        2006         13
2        2007         14
2        2008         15
2        2009         0
2        2010         16
以上数据,v变量取值有0,我想以此形成两个新的数据集:
第一个,保留每个个体中,v取0(连续取0时的第一个)且其前面的数据(直到v再次取0),就以上数据来说,在个体1中,2002年v取0,所以保留2000-2002的数据,2006年v再次取0,保留2004-2006的数据;在个体2中,2004年v取0,保留2000-2004的数据,2009年再次取0,保留2006-2009的数据,所以想得到的数据集为:
id        t                v
1        2000         1
1        2001         2
1        2002         0
1        2004         3
1        2005         4
1        2006         0
2        2001         10
2        2002         11
2        2003         12
2        2004         0
2        2006         13
2        2007         14
2        2008         15
2        2009         0
第二个数据集,保留v取0且后面不取0的第一个数据,例如,个体1,2002和2003年v取0,所以保留2002-2004的数据,2006年v再次取0,保留2006和2007的数据;个体2,2004和2005年v取0,所以保留2004-2006的数据,2009年再次取0,保留2009和2010的数据,所以想得到的数据为:
id        t                v
1        2002         0
1        2003         0
1        2004         3
1        2006         0
1        2007         5
2        2004         0
2        2005         0
2        2006         13
2        2009         0
2        2010         16
可以分两次得到数据,非常感谢!

最佳答案

lyfyb99 查看完整内容

data test; input id t v; cards; 1 2000 1 1 2001 2 1 2002 0 1 2003 0 1 2004 3 1 2005 4 1 2006 0 1 2007 5 1 2008 6 1 2009 7 1 2010 8 2 2000 9 2 2001 10 2 2002 11 2 20 ...
关键词:sas程序 非常感谢 数据集 程序

沙发
lyfyb99 在职认证  发表于 2016-4-19 10:09:35
data test;
input id  t  v;
cards;
1        2000         1
1        2001         2
1        2002         0
1        2003         0
1        2004         3
1        2005         4
1        2006         0
1        2007         5
1        2008         6
1        2009         7
1        2010         8
2        2000         9
2        2001         10
2        2002         11
2        2003         12
2        2004         0
2        2005         0
2        2006         13
2        2007         14
2        2008         15
2        2009         0
2        2010         16
   ;
run;


**get first dataset;
proc sort data=test; by id t v; run;

data test01;
set test;
by id t v;
prev=lag(v);
run;

proc sort data=test01; by id descending t v; run;

data test02;
set test01;
by id descending t v;
retain flag;
if first.id then flag=.;
if v=0 then flag=1;
if not last.id then do;
if v=0 and prev=0 then delete;
end;
run;

proc sort data=test02 out=data1; by id t v; where flag=1; run;

**get second dataset;

data data2;
set test;
by id t v;
prev=lag(v);
if v=0 or prev=0;
run;

藤椅
liuliuqiu 发表于 2016-4-19 11:36:57
自己顶

板凳
guanglei 发表于 2016-4-19 12:19:59
你这个是按照id分别计算条件的吗?

如果个体2中第一个观测为0,个体1最后一个观测不为0,算是符合条件的吗?

报纸
liuliuqiu 发表于 2016-4-19 12:20:22
哪位大神过来帮帮忙吧

地板
liuliuqiu 发表于 2016-4-19 12:24:35
guanglei 发表于 2016-4-19 12:19
你这个是按照id分别计算条件的吗?

如果个体2中第一个观测为0,个体1最后一个观测不为0,算是符合条件的 ...
是按Id计算的。
每个个体的第一观测值不会为0,这是数据自身的特征。
但个体1最后一个观测值不为0,不符合条件,多谢!

7
孤单的我们 发表于 2016-4-19 14:19:06
徒弟做的,回复的有点晚了,抱歉
  1. data test;
  2. input d t v;
  3. cards;
  4. 1 2000 1
  5. 1 2001 2
  6. 1 2002 0
  7. 1 2003 0
  8. 1 2004 3
  9. 1 2005 4
  10. 1 2006 0
  11. 1 2007 5
  12. 1 2008 6
  13. 1 2009 7
  14. 1 2010 8
  15. 2 2000 9
  16. 2 2001 10
  17. 2 2002 11
  18. 2 2003 12
  19. 2 2004 0
  20. 2 2005 0
  21. 2 2006 13
  22. 2 2007 14
  23. 2 2008 15
  24. 2 2009 0
  25. 2 2010 16
  26. ;
  27. run;
  28. data test1;
  29.         retain sort 0;
  30.         set test;
  31.         by d t;
  32.         dif=dif(v);
  33.         if first.d then sort=0;
  34.                 else if v=0 & dif ne 0 then sort+1;
  35. run;
  36. /*数据集一*/
  37. data want1;
  38.         set test1;
  39.         by d sort v;
  40.         if sort<=1 | (first.sort & sort=2);
  41.         if dif ne 0 ;
  42.         drop sort dif;
  43. run;
  44. /*数据集二*/
  45. data want2;
  46.    set test1;
  47.    if  v=0 |  v=dif;
  48.    drop sort dif;
  49. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 热心帮助其他会员

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

8
liuliuqiu 发表于 2016-4-19 15:07:11
孤单的我们 发表于 2016-4-19 14:19
徒弟做的,回复的有点晚了,抱歉
非常感谢!
第二个数据集没问题,但第一个数据集好像不对

9
liuliuqiu 发表于 2016-4-19 15:08:58
lyfyb99 发表于 2016-4-19 14:42
data test;
input id  t  v;
cards;
非常感谢!第一个数据集没问题,第二个数据集不大对。第二个数据集中,我想得到的是包括v取值为0(全部)和后面第一个不为0的数据。
再次感谢!

10
孤单的我们 发表于 2016-4-19 15:09:52
liuliuqiu 发表于 2016-4-19 15:07
非常感谢!
第二个数据集没问题,但第一个数据集好像不对
d=2,t=2000,v=9  这个是你写漏了吧

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

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