楼主: liuliuqiu
1408 8

[有偿编程] 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-18 09:57:29 |AI写论文
5论坛币
求教:   id   year
   1    2001
   1    2002
   1    2004
   1    2005
   2    2002
   2    2003
   2    2004
   3    ...
以上数据有Id 和时间两个变量,其中每个个体中,时间可能是连续的,也可能是间断的,最后结果想得到时间间断的数据。
请教如何求得?
非常感谢!

最佳答案

casper2 查看完整内容

建议,先把数据排序,然后新建一个变量y2,把y2赋值为各ID的第一个值,然后下一个obs y2增1。再做比较year vs. y2,相同者赋值0给新变量flag,否则flag为1。再做一个proc univariate,对flag求和,不等于0者保留。
关键词:sas程序 year 非常感谢 ear 程序 如何

沙发
casper2 发表于 2016-4-18 09:57:30
建议,先把数据排序,然后新建一个变量y2,把y2赋值为各ID的第一个值,然后下一个obs y2增1。再做比较year vs. y2,相同者赋值0给新变量flag,否则flag为1。再做一个proc univariate,对flag求和,不等于0者保留。
已有 1 人评分论坛币 热心指数 收起 理由
admin_kefu + 20 + 2 热心帮助其他会员

总评分: 论坛币 + 20  热心指数 + 2   查看全部评分

藤椅
liuliuqiu 发表于 2016-4-18 10:20:40
求解答

板凳
孤单的我们 发表于 2016-4-18 10:38:52
  1. data test;
  2. input id year;
  3. cards;
  4. 1 2001
  5. 1 2002
  6. 1 2004
  7. 1 2005
  8. 2 2002
  9. 2 2003
  10. 2 2004
  11. ;
  12. run;

  13. data text1;
  14.         set test;
  15.         by id;
  16.         dif=dif(year);
  17.         if first.id then dif=.;
  18. run;

  19. proc sql;
  20.         select id,year from text1 group by id having max(dif)>1 order by id,year;
  21. quit;
复制代码
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 精彩帖子
admin_kefu + 20 热心帮助其他会员

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

报纸
lyfyb99 在职认证  发表于 2016-4-18 10:47:47
data test;
input id year;
cards;
   1    2001
   1    2002
   1    2004
   1    2005
   2    2002
   2    2003
   2    2004
   3    2002
   3    2005
   3    2007
   ;
run;

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

data test01;
set test;
by id year;
preyear=lag(year);
if not first.id then do;
dif=year-preyear;
if dif ne 1 then output;
end;
run;

proc sql;
create table test02 as
select *
from test
where cats(put(id,best.), put(year, best.)) in (select cats(put(id,best.), put(year, best.)) from test01)
or   cats(put(id,best.), put(year, best.)) in (select cats(put(id,best.), put(preyear, best.)) from test01);
quit;
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

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

地板
lyfyb99 在职认证  发表于 2016-4-18 10:48:03
data test;
input id year;
cards;
   1    2001
   1    2002
   1    2004
   1    2005
   2    2002
   2    2003
   2    2004
   3    2002
   3    2005
   3    2007
   ;
run;

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

data test01;
set test;
by id year;
preyear=lag(year);
if not first.id then do;
dif=year-preyear;
if dif ne 1 then output;
end;
run;

proc sql;
create table test02 as
select *
from test
where cats(put(id,best.), put(year, best.)) in (select cats(put(id,best.), put(year, best.)) from test01)
or   cats(put(id,best.), put(year, best.)) in (select cats(put(id,best.), put(preyear, best.)) from test01);
quit;

7
liuliuqiu 发表于 2016-4-18 11:04:49
自己顶

8
孤单的我们 发表于 2016-4-18 11:06:23
回复需要审核...

9
liuliuqiu 发表于 2016-4-18 11:41:54
casper2 发表于 2016-4-18 11:40
建议,先把数据排序,然后新建一个变量y2,把y2赋值为各ID的第一个值,然后下一个obs y2增1。再做比较year  ...
恩,好的,谢谢

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

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