楼主: 小鳄鱼a
1489 11

求助个问题 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

300论坛币
如表格描述   顶顶顶顶顶顶顶顶顶大大大

a.xlsx

10.11 KB

最佳答案

teqel 查看完整内容

看看这个
沙发
teqel 发表于 2015-12-14 20:03:44 |只看作者 |坛友微信交流群
看看这个
  1. data a;
  2. input name $ com $ date date9.;
  3. format date date9.;
  4. cards;
  5. Jiang AAA 23Oct2011
  6. Jiang AAA 21Oct2012
  7. Li AAA 23Oct2011
  8. Li AAA 20Dec2011
  9. Li AAA 23Oct2012
  10. Zhang AAA 23Oct2011
  11. Zhang BBB 28Oct2011
  12. Zhang AAA 21Oct2012
  13. Tian AAA 23Oct2011
  14. Tian BBB 28Oct2011
  15. Tian AAA 28Oct2012
  16. ;

  17. **** Sort data;
  18. proc sort data=a;
  19. by name date;
  20. run;

  21. **** Add a flag to catch the company change;
  22. data b;
  23. set a;
  24. by name date;
  25. com1=lag(com);
  26. if first.name then flag=1;
  27. else if com~=com1 then flag+1;
  28. drop com1;
  29. run;

  30. ****self join to remove the name;
  31. proc sql;
  32. create table c as
  33. select * from a where name not in
  34. (
  35. select b1.name from b as b1 inner join b as b2
  36. on b1.name=b2.name and b1.com=b2.com and b1.flag~=b2.flag
  37. and 0<b1.date-b2.date<365
  38. );
  39. quit;
复制代码

使用道具

藤椅
pobel 在职认证  发表于 2015-12-15 08:49:56 |只看作者 |坛友微信交流群
如果数据量不太大,试试这个:
proc sql;
   create table wanted as
    select * from have
        where name not in
     (select distinct l.name
         from have as l, have as r
         where l.name=r.name and l.com=r.com and l.date ne r.date and intck("Year",l.date,r.date,"c")=0);
quit;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

板凳
吕小布韦 发表于 2015-12-15 23:57:10 |只看作者 |坛友微信交流群
假设原始数据集为aproc sort data=a;
by name date;
run;

data b(drop=com date);
set a;
by name date;
if first.name then do;
comfirst=com;
datefirst=date;
output;
end;
run;
这样数据集b中就包含了每个人的第一个com

data c(keep=name);
merge a(in=ina) b(in=inb);
by name;
if comfirst=com  and date^=datefirst and date-datefirst<365 then output;
run;
数据集c中保留的是要删去的人的名字

data d;
merge a(in=ina) c(in=inc);
by name;
if ina and not inc;
run;

楼上的好像有个问题, 就是某人中间有两次公司重复了也会被删除.
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

报纸
teqel 发表于 2015-12-16 01:02:26 |只看作者 |坛友微信交流群
楼上这个有相同的问题。而且也不总是看第一个公司

使用道具

地板
小鳄鱼a 发表于 2015-12-16 09:18:43 |只看作者 |坛友微信交流群
teqel 发表于 2015-12-16 01:48
看看这个
谢谢   请问你这个程序思路  是不是  确保    假如有两个同样的com的间隔着其他的com出现,那么这两个com出现的时间不能够小于365 ,否则删除

使用道具

7
teqel 发表于 2015-12-16 09:31:13 |只看作者 |坛友微信交流群
小鳄鱼a 发表于 2015-12-16 09:18
谢谢   请问你这个程序思路  是不是  确保    假如有两个同样的com的间隔着其他的com出现,那么这两个com ...
基于这个设想:就是相同的公司之间会有另外一家公司。任何被间隔的同个公司的时间间隔小于365天,就删除name。不过例子上的数据还不够多,需要更多的验证

使用道具

8
吕小布韦 发表于 2015-12-16 13:01:27 |只看作者 |坛友微信交流群
我做的时候按照excel里面说的 "倘若刘晓最后又出现在开始的com", 所以只考虑了是否与最早的com重复, 按照题主的意思, 张三没有被删除, 应该也是只考虑了第一条.

如果说要考虑任意两条, 直接用pobel大神的即可, 程序简洁

使用道具

9
吕小布韦 发表于 2015-12-16 13:05:33 |只看作者 |坛友微信交流群
刚才试了, 你这个也不行啊.

使用道具

10
小鳄鱼a 发表于 2015-12-16 13:49:30 |只看作者 |坛友微信交流群
吕小布韦 发表于 2015-12-16 13:05
刚才试了, 你这个也不行啊.
不好意思   excel文字说明有问题     本意是同一com中间如果间隔了其他  com   ,如
1998/6/1        王五        金华
1998/7/1        王五        金华
1998/9/1        王五        凤阳
1999/9/9        王五        凤阳
1999/11/1        王五        金华
1998/12/1        王五        金华
那么   考察的时间段是  1998/7/1 到  1999/11/1 的天数

使用道具

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

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

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

GMT+8, 2024-4-25 13:38