楼主: lyceum
1667 3

[原创博文] 关于分组的问题 [推广有奖]

  • 0关注
  • 3粉丝

已卖:251份资源

硕士生

31%

还不是VIP/贵宾

-

威望
0
论坛币
232 个
通用积分
2.1052
学术水平
13 点
热心指数
24 点
信用等级
5 点
经验
3180 点
帖子
121
精华
0
在线时间
129 小时
注册时间
2007-3-29
最后登录
2023-12-26

楼主
lyceum 发表于 2011-7-9 01:18:29 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
原始数据很大无法手工完成,数据结构如下

data test;
input id $ date ;
datalines;

p01   07/09/2007
p01   09/11/2008
p01  06/05/2009
p02  10/24/2007
p02  12/19/2008
p03  05/10/2007
p03  08/12/2008
p04  0626/2007
p04  08/12/2008
p04  07/21/2009
p04  08/22/2010
;
run;


想得到以下分组结果,即同一id时间上依次两两分组,比如对于P02 或者p03来讲只有两条数据那么就直接保留原始分组就可以了,但对于p01因为有三条数据那么就要重复使用 p01   09/11/2008这条数据以达到时间上依次两两分组的目的,对于P04也是一样的只是需要分更多的组以达到时间上每个id都是下面的时间和上面的时间两两分组,(分组后的id 没有什么限制可以用保留原来的也可以给新的id比如group1,group2 等)。不知讲清楚了没有,请高手帮忙,先谢了!
p01   07/09/2007
p01   09/11/2008

p01  09/11/2008
p01  06/05/2009

p02  10/24/2007
p02  12/19/2008

p03  05/10/2007
p03  08/12/2008

p04  0626/2007
p04  08/12/2008

p04 08/12/2008
p04  07/21/2009

p04 07/21/2009
p04  08/22/2010
二维码

扫码加我 拉你入群

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

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

关键词:Group Lines Input Data 数据结构 手工

本帖被以下文库推荐

沙发
bobguy 发表于 2011-7-9 09:29:11
lyceum 发表于 2011-7-9 01:18
原始数据很大无法手工完成,数据结构如下

data test;
input id $ date ;
datalines;

p01   07/09/2007
p01   09/11/2008
p01  06/05/2009
p02  10/24/2007
p02  12/19/2008
p03  05/10/2007
p03  08/12/2008
p04  0626/2007
p04  08/12/2008
p04  07/21/2009
p04  08/22/2010
;
run;


想得到以下分组结果,即同一id时间上依次两两分组,比如对于P02 或者p03来讲只有两条数据那么就直接保留原始分组就可以了,但对于p01因为有三条数据那么就要重复使用 p01   09/11/2008这条数据以达到时间上依次两两分组的目的,对于P04也是一样的只是需要分更多的组以达到时间上每个id都是下面的时间和上面的时间两两分组,(分组后的id 没有什么限制可以用保留原来的也可以给新的id比如group1,group2 等)。不知讲清楚了没有,请高手帮忙,先谢了!
p01   07/09/2007
p01   09/11/2008

p01  09/11/2008
p01  06/05/2009

p02  10/24/2007
p02  12/19/2008

p03  05/10/2007
p03  08/12/2008

p04  0626/2007
p04  08/12/2008

p04 08/12/2008
p04  07/21/2009

p04 07/21/2009
p04  08/22/2010
Here is a solution with a simple logic....

data test;
input id $ date ;
informat date mmddyy10.;
format date date9.;
datalines;
p01   07/09/2007
p01   09/11/2008
p01  06/05/2009
p02  10/24/2007
p02  12/19/2008
p03  05/10/2007
p03  08/12/2008
p04  06/26/2007
p04  08/12/2008
p04  07/21/2009
p04  08/22/2010
p04  08/24/2010
p04  08/25/2010
p04  08/29/2010
;
proc sql;
create table test2 as
select *, count(*)*0.5 as mean
from test
group by 1
order by 1,2
;
quit;
data test3;
  set test2;
  by id;
  if first.id then N=0;
  N+1;
  if n-mean=0.5 then do;  
   group=1;
      output;
  end;
  if n-mean<=0 then group=1;
  else group=2;
  output;
  run;
  proc print;run;
已有 1 人评分论坛币 收起 理由
liuzhenzhu + 10 热心帮助其他会员

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

藤椅
lyceum 发表于 2011-7-12 00:48:37
感谢教授热心帮助,思路简洁清晰,学习了,按照代码运行了一下似乎p04分组少了一些,不知什么原因。

板凳
soporaeternus 发表于 2011-7-12 08:43:24
  1. data test;
  2.         set test;
  3.         n+1;
  4. run;

  5. proc sql;
  6.         create table r(drop=date rename=(date1=date)) as
  7.                 select       
  8.                         a.id
  9.                         ,a.date format=mmddyy10.
  10.                         ,b.date as date1 format=mmddyy10.
  11.                 from test a
  12.                 inner join test b
  13.                 on a.id=b.id
  14.                 and 0<=b.n-a.n<=1
  15.                 group by
  16.                         a.id
  17.                         ,a.date
  18.                 having count(b.date)=2
  19.                 order by
  20.                         a.id
  21.                         ,a.date
  22.                         ,date1
  23.         ;       
  24. quit;
复制代码
Let them be hard, but never unjust

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 03:43