请选择 进入手机版 | 继续访问电脑版
楼主: 小鳄鱼a
1029 7

根据连接的数进行分组 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

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

小鳄鱼a 发表于 2016-10-26 23:14:28 |显示全部楼层 |坛友微信交流群
500论坛币
规则是,ida和idb代表一种连接,只要一个数字相同,就组成一个group(需要程序进行),比如 1 2 3 4 6是一组, 5 7 9 11是一组。希望给出如下group的结果。每年进行一次。如果能整合成一个id,讲所有ida与idb的进行分组更好。
year idaidbgroup

1999

1

3

1

1999

2

1

1

1999

4

1

1

1999

6

1

1

1999

1

6

1

1999

9

5

2

1999

5

7

2

1999

7

11

2


最佳答案

pobel 查看完整内容

data a; input year ida idb; cards; 1999 1 3 1999 2 4 1999 33 66 1999 4 1 1999 1 6 1999 9 5 1999 5 7 1999 6 1 1999 7 11 1999 22 33 1999 88 99 ; data b; set a; ida_c=cats("*",ida,"*"); idb_c=cats("*",idb,"*"); n_obs=_n_; run; data c; length searched members $100; retain group 0 searched " "; set b; if index(searched,cats("*",_n_,"*"))=0; ...
关键词:Group year ear BGR Dai 如何
pobel 在职认证  发表于 2016-10-26 23:14:29 |显示全部楼层 |坛友微信交流群
data a;
  input year ida idb;
  cards;
1999 1 3
1999 2 4
1999 33 66
1999 4 1
1999 1 6
1999 9 5
1999 5 7
1999 6 1
1999 7 11
1999 22 33
1999 88 99
;

data b;
   set a;
   ida_c=cats("*",ida,"*");
   idb_c=cats("*",idb,"*");
   n_obs=_n_;
run;

data c;
   length searched members $100;
   retain group 0 searched " ";
   set b;
   if index(searched,cats("*",_n_,"*"))=0;
   group+1;
   grp=cats(ida_c,idb_c);
   if _n_=1 then do;
         searched="*1*";
         members="1*";
         n=1;
       end;
    else do; members=" "; n=0; end;
   do until (find=0);
       find=0;
       do obs=2 to nobs;
               if index(searched,cats("*",obs,"*"))=0 then do;
                   set b point=obs nobs=nobs;
                   if index(grp,strip(ida_c)) or index(grp,strip(idb_c)) then do;
                       find=1;
                       n+1;
                        searched=cats(searched,obs,"*");
                        members=cats(members,obs,"*");
                        if index(grp,strip(ida_c))=0 then grp=cats(grp,ida_c);
                        if index(grp,strip(idb_c))=0 then grp=cats(grp,idb_c);
                    end;
                end;
         end;
    end;

     put group= members= n= grp=;
     do j=1 to n;
          n_obs=input(scan(members,j,"*"),best.);
          output;
     end;
     keep group n_obs;
run;


proc sort data=c; by n_obs; run;

data d;
     merge b c;
     by n_obs;
     drop ida_c idb_c n_obs;
run;

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
prince315 + 20 + 20 + 3 + 3 + 3 观点有启发
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

和谐拯救危机

使用道具

小鳄鱼a 发表于 2016-10-27 09:44:04 |显示全部楼层 |坛友微信交流群
我的想法是先固定(1,3),先第一轮中找重复的,只要其中一个与前面累积的数组中有重合,就把该组放在前面,否则等待下一轮再匹配,这主要是牵扯到节点长度,所以感觉有点复杂

使用道具

小鳄鱼a 发表于 2016-10-27 19:04:16 |显示全部楼层 |坛友微信交流群
pobel 发表于 2016-10-27 15:51
data a;
  input year ida idb;
  cards;
非常感谢pobel大神的帮助,十分荣幸,如果有时间能加一些注释就更好了,或者简单说一下写程序的思路

使用道具

pobel 在职认证  发表于 2016-10-27 20:27:49 |显示全部楼层 |坛友微信交流群
小鳄鱼a 发表于 2016-10-27 19:04
非常感谢pobel大神的帮助,十分荣幸,如果有时间能加一些注释就更好了,或者简单说一下写程序的思路
大致思路是这样:
先以第一行作为起始点,寻找与第一行是一组的记录。
grp记录当前查找的这个组里遇到的id值。
members记录的是都有哪一行属于这个组。
searched记录的是已经找到“分组”的那些行,之后可以直接跳过那些行。
1. 从第二行到最后一行,依次检测是不是符合“同组条件”。如果某一行符合,那么
    a. 如果这一行有新的id值,那么就添加到grp的值里。
    b. 将这一行的行数(数据集的第几行)添加到members变量
2. 然后开始第二轮查找,这次只会查找第一轮查找“剩下”的记录。
3. 有可能会需要第三轮甚至更多次查找。
直到某一轮没有找到同组的记录,说明这一个分组完成了。把属于这一组(group变量值)的记录行数输出。

接下来,回到数据集,找到一个还没有被分组的变量。重置members,grp变量。重新开始新的一组查找。
直到所有记录都分组完成。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

小鳄鱼a 发表于 2016-10-27 23:22:28 |显示全部楼层 |坛友微信交流群
pobel 发表于 2016-10-27 20:27
大致思路是这样:
先以第一行作为起始点,寻找与第一行是一组的记录。
grp记录当前查找的这个组里遇到的 ...
谢谢    我跟您编程思路一样    就是写不出来     先研究研究   

使用道具

小鳄鱼a 发表于 2016-11-8 22:16:51 |显示全部楼层 |坛友微信交流群
pobel 发表于 2016-10-26 23:14
data a;
  input year ida idb;
  cards;
你好,如果我要参与分组的观测比较多,再使用cat函数合适吗

使用道具

小鳄鱼a 发表于 2016-11-8 22:17:06 |显示全部楼层 |坛友微信交流群
pobel 发表于 2016-10-26 23:14
data a;
  input year ida idb;
  cards;
你好,如果我要参与分组的观测比较多,再使用cat函数合适吗

使用道具

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

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

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

GMT+8, 2024-3-30 15:19